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语言代码)浏览:834 |
【数组的距离】 (C语言代码)浏览:787 |
淘淘的名单 (C语言代码)答案错误???浏览:625 |
2003年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:634 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:725 |
2005年春浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:638 |
字符逆序 (C语言代码)浏览:675 |
川哥的吩咐 (C语言代码)浏览:664 |
C语言程序设计教程(第三版)课后习题11.3 (C语言代码)浏览:664 |
1392题解(大数相加)浏览:640 |