问题:如何使用UDP进行数据收发?UDP协议讨论UDP是无连接的(不可靠,无响应消息,数据包没有序号标识)UDP是面向包的,既不合并也不拆分应用层数据(保留包边界)UDP不拥塞控制,网络拥塞不会降低源主机的发送速率UDP支持一对一、一对多、多对一和多对多的交互通信UDP报文头开销小,只有8字节(TCP报文包头一共20个字节)UDP和IP的区别UDP是建立在IP之上的一种数据传输协议。IP负责将UDP数据包从源主机传送到目标主机。UDP将应用层数据传递到目标socket(端口号)UDP几乎完全“继承”了IP传输的特点。通信两端没有交互,没有流量控制,没有超时重传,没有可靠性。UDP发送和接收数据#include"sys/socket.h"ssize_tsend(intsock,//Socket文件描述符void*buf,//要发送的数据size_tnbytes,//要发送的数据量intflags,//发送选项structsockaddr*to,//接收地址信息socklen_taddrlen);//到参数长度ssize_trecvfrom(intsock,//套接字文件描述符void*buf,//保存接收数据的地址size_tnbytes,//可以接收的最大数据量intflags,//接收选项结构sockaddr*from,//接收地址信息socklen_t*addrlen);//指向保存from参数长度的变量地址UDP编程方式编程实验:UDP数据收发client.c#include#include#include#include#include#include#includeintmain(){intsock=0;结构sockaddr_in地址={0};结构sockaddr_in远程={0};socklen_tlen=0;字符buf[128]={0};字符输入[32]={0};整数r=0;sock=socket(PF_INET,SOCK_DGRAM,0);if(sock==-1){printf("套接字错误\n");返回-1;}addr.sin_family=AF_INET;地址.sin_addr.s_addr=htonl(INADDR_ANY);地址.sin_port=htons(7777);if(bind(sock,(structsockaddr*)&addr,sizeof(addr))==-1){//特别说明,使用udpsocket发送数据时,无需指定bind(即ipandport)printf("udp绑定错误\n");//但是udp是无连接的,所以不像TCP,有一个很明显的服务端等待客户端发起连接的过程return-1;//udp的通信端点是点对点的。为了方便接收其他端点发送的数据,指定了ip和端口号(尤其是端口号)。}remote.sin_family=AF_INET;remote.sin_addr.s_addr=inet_addr("127.0.0.1");remote.sin_port=htons(8888);while(1){printf("输入:");scanf("%s",输入);len=sizeof(远程);sendto(sock,input,strlen(input),0,(structsockaddr*)&remote,len);r=recvfrom(sock,buf,sizeof(buf),0,(structsockaddr*)&remote,&len);如果(r>0){buf[r]=0;printf("从%s中接收\n",buf);}else{休息;}}关闭(袜子);返回0;}server.c#include#include#include#include#include#include#includeintmain(){intserver=0;结构sockaddr_insaddr={0};int客户=0;结构sockaddr_in远程={0};socklen_t大小=0;int长度=0;字符buf[32]={0};整数r=0;服务器=套接字(PF_INET,SOCK_DGRAM,0);if(server==-1){printf("服务器套接字错误");返回-1;}saddr.sin_family=AF_INET;saddr.sin_addr.s_addr=htonl(INADDR_ANY);saddr.sin_port=htons(8888);if(bind(server,(structsockaddr*)&saddr,sizeof(saddr))==-1){printf("udp服务器绑定错误\n");返回-1;}printf("udp服务器启动成功\n");while(1){len=sizeof(远程);r=recvfrom(server,buf,sizeof(buf),0,(structsockaddr*)&remote,&len);缓冲区[r]=0;printf("r=%d\n",r);printf("buf=%s\n",buf);printf("远程ip=%s\n",inet_ntoa(remote.sin_addr));printf("远程端口=%d\n",ntohs(remote.sin_port));发送到(服务器,buf,r,0,(structsockaddr*)&remote,len);}关闭(服务器);return0;}output:server:udpserverstartsucessr=5buf=helloremoteip=127.0.0.1remoteport=7777---client:Input:helloRecvfromhello思考:如何收发一对多的UDP数据?