当前位置: 首页 > Linux

UDP协议

时间:2023-04-06 07:10:26 Linux

UDP协议介绍UDP协议分为头域和数据域,其中头域只占8个字节,分别是源端口、目的端口、长度和校验和,占两个字节。具体的协议字段信息如下:Length:UDP报文的整个大小,最小为8字节(仅报头)Checksum:在进行校验和计算时,会加入一个伪报头进行计算。伪头(12字节)为:4字节源IP地址,4字节目的IP地址,1字节0,1字节数字17,2字节UDP长度。这个伪报头并不是报文真正的报头,只是为了计算校验和而引入的。与只计算头部的IP协议相比,UDP校验和将头部和数据一起检查。接收端执行的校验和与UDP报文中的校验和进行AND运算,如果没有错误,应该全为1。如果有错误,则丢弃该数据包或发送给应用层并发出错误警告随附的。UDP实现ssize_tsendto(intsockfd,constvoid*buf,size_tlen,intflags,conststructsockaddr*dest_addr,socklen_taddrlen);ssize_trecvfrom(intsockfd,void*buf,size_tlen,intflags,addstructrcsockaddr,*ssocklen_t*addrlen);dest_addr:是接收端的IP地址和端口信息;src_addr:是发送端的IP地址和端口信息;一个简单的例子:udp_client.c#include#include#include#include#include#include#include#include#defineBUF_SIZE1024intmain(intargc,char*argv[]){structaddrinfohint,*result;intres,sfd;字符buf[BUF_SIZE];sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd==-1){perror("套接字错误!\n");退出(1);}结构sockaddr_in地址;memset(&addr,0,sizeof(structsockaddr_in));无符号短端口=8080;地址.sin_family=AF_INET;地址.sin_port=htons(端口);地址sin_addr.s_addr=inet_addr("192.168.100.168");if(connect(sfd,(structsockaddr*)&addr,sizeof(structsockaddr_in))!=0){perror("连接错误");退出(1);}snprintf(buf,BUF_SIZE,"你好服务器,现在我将向你发送数据");if(send(sfd,buf,strlen(buf),0)<=0){perror("发送失败。");退出(1);}printf("发送数据给clint:%s\n",buf);memset(buf,0,sizeof(buf));res=recv(sfd,buf,BUF_SIZE,0);printf("从服务器接收到%d个字节。\n",res);printf("从服务器接收数据:%s.\n",buf);返回0;}udp_server.c#include#include#include#include#include#include#include#include#defineBUF_SIZE1024intmain(intargc,char*argv[]){structaddrinfohint,*result;结构sockaddr_inclient_addr;intres,sfd,客户端t_addr_len;字符buf[BUF_SIZE];结构sockaddr_in地址;memset(&addr,0,sizeof(structsockaddr_in));无符号短端口=8080;地址.sin_family=AF_INET;地址.sin_port=htons(端口);addr.sin_addr.s_addr=INADDR_ANY;sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd==-1){perror("套接字错误!\n");退出(1);}res=bind(sfd,(structsockaddr*)&addr,sizeof(structsockaddr_in));if(res==-1){perror("绑定错误!\n");退出(1);}while(1){printf("等待客户端...\n");res=recv(sfd,buf,BUF_SIZE,0);if(res==-1){perror("recvfromerror\n");退出(1);}printf("收到数据:%s\n",buf);snprintf(buf,BUF_SIZE,"helloclient!Totalreveive:%d.",res);//res=sendto(sfd,buf,strlen(buf),0,(structsockaddr*)&client_addr,client_addr_len);res=send(sfd,buf,strlen(buf),0);if(res!=strlen(buf)){perror("发送错误\n");退出(1);}printf("发送%d字节给对等方",res);printf("发送数据<%s>给客户端\n\n",buf);}}

猜你喜欢