UDP编程

TCP的API补充:

1.send()函数

ssize_t send(int sockfd,

const void *buf,

size_t len,

int flags

);

。参数:

■ sockfd:socket函数返回的fd

■ buffer:发送缓冲区首地址

I

■ length:发送的字节

■ flags:发送方式(通常为0),作用和write一样

■ MSG_DONTWAIT,非阻塞

■ MSG_OOB:用于TCP类型的带外数据(out of band)

返回值:

。 成功:实际发送的字节数

。 失败:-1,并设置errno

网络中接收数据:

2.recv()/read()

• int recv( SOCKET s, char FAR *buf, int len, int flags);

o flag:一般填0,和read作用一样

。 特殊的标志:

■ MSG_DONTWAIT

■ MSG_OOB:读取带外数据

■ MSG_PEEK:流

bind:绑定服务器:TCP地址和端口号

receivefrom():阻塞等待客户端数据

sendto():指定服务器的IP地址和端口号,要发送的数据

无连接尽力传输,UDP:是不可靠传输

实时的音视频传输,DNS域名解析包

复制代码
#include <stdto.hs
#include <stdltb.h>
#include <unistd.h>
#include <string.h>
#include <strings.har
#include<sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define SERV_PORT 5001
#define SERV_IP_ADDR192.168.182.144"
#define BUFSIZE 1024
#define QUIT_STR "QUIT"
int main()
{
	int fd = -1;
	struct sockaddr_in sin;
	//1.socket
	fd = socket(AF_INET, SOCK_DGRAM, 0);
	if(fd <0)
	{
		perror("socket");
		exit(1);
	}
	int b_reuser=1;

	//2.addr
	setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &b_ reuser, sizeof(int));

	//bind
	bzero(&sin, sizeof(sin));

	sin.sin_family = AF_INET;
	sin.sin port = htons(SERV_PORT);
	sin.sin addr.s_addr = htonl(INADDR_ANY);

	if(bind(fd, (struct sockaddr*)&sin, sizeof(sin)) <6)
	{
		perror("bind");
		exit(1);
	}

	char buf[BUFSIZE];
	struct sockaddr_in cin;
	socklen_t addrlen = sizeof(cin);
	while(1)
	{
		bzero(buf, BUFSIZE);
		if(recvfrom(fd.buf, BUFSIZE-1, 0, (struct sockaddr*)&cin, &addrlen)<0)
		{	
			perror("recvfrom");
			continue;
		}
		char ipv4_addr[16];
		if(!inet_ntop(AF_INET, (vold *)&cin.sin_addr, tpv4_addr, sizeof(cin)))
		{
			perror("inet_ntop");
			exit(1);
		}
		printf("receive from(%s, %d), data:%s\n", tpv4_addr, ntohs(cin.sin_port), buf);

		if(!strncasecmp(buf, QUIT_STR, strlen(QUIT_STR)))
		{
		printf(cltent(%s:%d)is exiting!\n", ipv4_addr,ntohs(cin.sin_port));
		}
	}	
	close(fd);
	return 0;
}

UDP客户端

复制代码
#include <stdto.h>
#include<stdlib.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <arpa/inet.h>
#define SERV_PORT 5001
#define SERV IP_ADDR "192.168.182.144"
#define QUIT_STR"QUIT"
#define BUFSIZE 1024
int main(int argc,char**argv)
{
	if(argc != 3)
	{
		exit(1);
	}
	int fd =-1;
	fd = socket(AF_INET, SOCK_ DGRAM, 0);
	if(fd <0)
	{	
		perror("socket");
		exit(1);
	}
	int port = -1;	
	port = atoi(argv[2]);
	struct sockaddr_in sin;
	bzero(&sin, sizeof(sin));
	sin.sin family = AF INET;
	sin.sin_port = htons(port);
	sin.sin_addr.s_addr= inet_addr(argv[1]);
	char buf[BUFSIZE];
	while(1)
	{
		if(fgets(buf, BUFSIZE-1, stdin) == NULL)
		{
			perror("fgets");
			continue;
		}
		sendto(fd, buf, strlen(buf), 0, (struct sockaddr*)&sin, sizeof(sin));
		if(!strncasecmp(buf, QUIT_STR, strlen(QUIT_STR)))
		{
			printf("client is extted!\n");
			break;
		}
	}
	close(fd);
	return 0;
}
相关推荐
wuminyu1 小时前
Kafka中sendfile与mmap实现机制解析
java·linux·c语言·jvm·c++
新时代牛马2 小时前
嵌入式网络完整篇:从LwIP/以太网驱动到 Linux netdev 与排障
linux·网络·php
猿与禅2 小时前
Linux(Ubuntu)入门到实战:系统管理、常用命令与权限体系完整指南
linux·ubuntu·apt·进程管理·系统运维·用户权限·vi/vim
前端世界2 小时前
Linux服务器实战:NTP时间同步、SELinux权限与rsyslog日志管理,一次搞懂三大运维问题
linux·运维·服务器
Android系统攻城狮2 小时前
Linux Gstreamer深度解析之gst_audio_converter_new调用流程与实战(二十)
linux·运维·服务器·gstreamer音视频·音视频进阶
H_oRIZoN_7 小时前
Linux入门DAY41(51 单片机 串口与通信协议)
linux·运维·单片机
GeW9 小时前
RHCE备考别瞎学!按这个计划走,30天提高通过率,快速拿证
linux
Escalating_xu9 小时前
【System V 信号量】从 P/V 原语到 Builder 封装:写出可控、可清理的进程互斥组件
java·linux·开发语言·jvm
傲世仙尊9 小时前
System V 进程间通信详解:共享内存、消息队列与信号量(CSDN博客)
linux·开发语言·c++
码农小韩9 小时前
Linux应用开发(六)——进程间通信
linux·linux驱动·嵌入式软件开发·嵌入式操作系统·linux应用