linux UDP 通信
1.linux socket地址2.linux IP 地址转换3.linux TCP 通信流程 套接字函数 socket() bind() listen() accept() connect()4.linux TCP通信实现 服务器端 - 客户端5.linux TCP 三次握手6.linux TCP滑动窗口 四次挥手7.linux 多进程实现并发服务器 多线程并发8.linux TCP状态转换 半关闭 shutdown netstat 端口复用 setsockopt9.linux IO多路复用 select poll epoll10.linux 多路复用---poll11.linux 多路复用---epoll
12.linux UDP 通信
13.linux 本地套接字通信14.linux Web服务器以及HTTP协议15.linux 服务器编程基本框架和两种高效事件的处理模式16.linux 线程池 EPOLLONESHOT事件UDP:
#include <sys/types.h> #include <sys/socket.h> ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); - 参数: - sockfd : 通信的fd - buf : 要发送的数据 - len : 发送数据的长度 - flag : 0 - dest_addr : 通信的另外一端的地址信息 - addrlen : 地址的内存大小 - 返回值: - 成功 : 数据大小(字节) - 失败 : -1 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); - 参数: - sockfd : 通信的fd - buf : 接收数据的数组 - len : 数组的大小 - flags : 0 - src_addr : 用来保存另外一端的地址信息, 不需要指定为 NULL - addrlen : 地址的内存大小 - 返回值: - 成功 : 数据大小(字节) - 失败 : -1
UDP客户端:
1 #include <stdio.h> 2 #include <arpa/inet.h> 3 #include <stdlib.h> 4 #include <unistd.h> 5 #include <string.h> 6 7 int main() 8 { 9 //创建socket 10 int fd = socket(PF_INET, SOCK_DGRAM, 0); 11 if(fd == -1) 12 { 13 perror("socket"); 14 return -1; 15 } 16 //服务器的地址信息 17 struct sockaddr_in saddr; 18 saddr.sin_family = AF_INET; 19 saddr.sin_port = htons(9999); 20 inet_pton(AF_INET, "127.0.0.1", &saddr.sin_addr.s_addr); 21 int num = 0; 22 //通信 23 while(1) 24 { 25 char sendbuf[128]; 26 sprintf(sendbuf, "hello, i am client %d\n",num++); 27 //发送数据 28 sendto(fd, sendbuf, strlen(sendbuf) + 1, 0, (struct sockaddr *)&saddr, sizeof(saddr)); 29 // 接收 30 int num = recvfrom(fd, sendbuf, sizeof(sendbuf), 0, NULL, NULL); 31 printf("server say: %s\n",sendbuf); 32 sleep(1); 33 } 34 close(fd); 35 return 0; 36 }
UDP服务器端:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <string.h> 5 #include <arpa/inet.h>// #include <sys/types.h> #include <sys/socket.h> 6 7 int main() 8 { 9 //1.创建一个通信socket 10 int fd = socket(PF_INET, SOCK_DGRAM, 0); 11 if(fd == -1) 12 { 13 perror("socket"); 14 exit(-1); 15 } 16 struct sockaddr_in addr; 17 addr.sin_family = AF_INET; 18 addr.sin_port = htons(9999); 19 addr.sin_addr.s_addr = INADDR_ANY; 20 //2.绑定 21 int ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr)); 22 if(ret == -1) 23 { 24 perror("bind"); 25 exit(-1); 26 } 27 //3.通信 28 while(1) 29 { 30 char recvbuf[128]; 31 char ipbuf[16]; 32 struct sockaddr_in cliaddr; 33 int len = sizeof(cliaddr); 34 //接收数据 35 int num =recvfrom(fd, recvbuf, sizeof(recvbuf), 0, (struct sockaddr *)&cliaddr, &len); 36 if(num == -1) 37 { 38 perror("recvfrom"); 39 exit(-1); 40 } 41 printf("client IP : %s, Port: %d\n",inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr,ipbuf, sizeof(ipbuf)),ntohs(cliaddr.sin_port)); 42 printf("client say : %s\n", recvbuf); 43 //发送数据 44 sendto(fd, recvbuf, strlen(recvbuf) + 1, 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr)); 45 } 46 close(fd); 47 return 0; 48 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)