Linux | 您所在的位置:网站首页 › linux编程代码 › Linux |
目录 一、实现的过程 二、代码: 1.ser.c 2.cli.c 三、运行结果 四、服务器端断开重运行,客户端还能发送吗?(可以) 五、可以同时运行两个客户端吗?(可以) 六、数据读取 //不粘包,会丢包 一、实现的过程//无连接、不可靠、尽最大的努力发出去,不保证能收到,效率高 UDP:视频传输,eg:打视频电话,处理丢包的成本很低; 二、代码: 1.ser.c #include #include #include #include #include #include #include #include int main() { int sockfd=socket(AF_INET,SOCK_DGRAM,0); if(sockfd==-1) { exit(0); } struct sockaddr_in saddr,caddr; memset(&saddr,0,sizeof(saddr)); saddr.sin_family=AF_INET; saddr.sin_port=htons(6000); saddr.sin_addr.s_addr=inet_addr("127.0.0.1"); int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr)); while(1) { int len=sizeof(caddr); char buff[128]={0}; int n=recvfrom(sockfd,buff,127,0,(struct sockaddr*)&caddr,&len); printf("ip:%s,buff=%s\n",inet_ntoa(caddr.sin_addr),buff); sendto(sockfd,"ok",2,0,(struct sockaddr*)&caddr,sizeof(caddr)); } } 2.cli.c #include #include #include #include #include #include #include #include int main() { int sockfd=socket(AF_INET,SOCK_DGRAM,0); if(sockfd==-1) { exit(0); } struct sockaddr_in saddr,caddr; memset(&saddr,0,sizeof(saddr)); saddr.sin_family=AF_INET; saddr.sin_port=htons(6000); saddr.sin_addr.s_addr=inet_addr("127.0.0.1"); int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr)); while(1) { int len=sizeof(caddr); char buff[128]={0}; int n=recvfrom(sockfd,buff,127,0,(struct sockaddr*)&caddr,&len); printf("ip:%s,buff=%s\n",inet_ntoa(caddr.sin_addr),buff); sendto(sockfd,"ok",2,0,(struct sockaddr*)&caddr,sizeof(caddr)); } } 三、运行结果udp是无连接的,服务器端断开,客户端并不知道,只看端口,哪怕不运行,也发出去了,是不过数据丢失 无连接,只要有人发,就会接收,可以直接接受来自于很多客户端的数据 sendto:不能保证目的地址一样, 如果没有把数据报内容收完,那么其余数据丢失, 再次接受的时候是下一个数据报 第一次发送的数据包是一个独立个体,接受完就结束,没接收完,剩下的也丢了 //不粘包,会丢包将接收大小由127改成1,一次只接受一个 |
CopyRight 2018-2019 实验室设备网 版权所有 |