udp 是一个面向无连接的,不安全的,报式传输层协议,udp 的通信过程默认也是阻塞的。
1、UDP通信不需要建立连接 ,因此不需要进行 connect () 操作
2、UDP通信过程中,每次都需要指定数据接收端的IP和端口,和发快递差不多
3、UDP不对收到的数据进行排序,在UDP报文的首部中并没有关于数据顺序的信息
4、UDP对接收到的数据报不回复确认信息,发送端不知道数据是否被正确接收,也不会重发数据。
如果发生了数据丢失,不存在丢一半的情况,如果丢当前这个数据包就全部丢失了
使用 UDP 进行通信,服务器和客户端的处理步骤比 TCP 要简单很多,并且两端是对等的 (通信的处理流程几乎是一样的),
也就是说并没有严格意义上的客户端和服务器端。UDP 的通信流程如下:
服务器代码:
#include<arpa/inet.h> #include<unistd.h> #include<stdbool.h> #include<stdint.h> #include<stdio.h> #include<stdlib.h> #define lv_exit(fd,str) \ if(fd<0) {\ perror(str);\ exit(1);\ } int main(int argc, char const *argv[]) { int fd=socket(AF_INET,SOCK_DGRAM,0); lv_exit(fd,"socket"); struct sockaddr_in seraddr; seraddr.sin_family=AF_INET; seraddr.sin_port=htons(9999); seraddr.sin_addr.s_addr=inet_addr("192.168.244.154"); int bret=bind(fd,(void*)&seraddr,sizeof seraddr); lv_exit(bret,"bind"); while (1) { struct sockaddr_in cliaddr; socklen_t clilen=sizeof cliaddr; char buf[512]={0}; ssize_t len= recvfrom(fd,buf,sizeof(buf)-1,0,(void*)&cliaddr,&clilen); printf("%s %d %s ",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port),buf); lv_exit(len,"recvfrom"); len=sendto(fd,buf,len,0,(void*)&cliaddr,clilen); lv_exit(len,"sendto"); } return 0; }
测试流程:
启动服务器:
启动客户端:
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复