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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复