linux TCP通信实现 服务器端 - 客户端
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 多路复用---epoll12.linux UDP 通信13.linux 本地套接字通信14.linux Web服务器以及HTTP协议15.linux 服务器编程基本框架和两种高效事件的处理模式16.linux 线程池 EPOLLONESHOT事件1 //TCP通信的服务器端 2 3 #include <stdio.h> 4 #include <arpa/inet.h> 5 #include <unistd.h> 6 #include <string.h> 7 int main() 8 { 9 //1.创建 socket(用于监听的套接字) 10 int lfd = socket(AF_INET, SOCK_STREAM, 0);//IPv4 流式协议 TCP lfd = 获取的文件描述符 11 if(lfd == -1) 12 { 13 perror("socket"); 14 exit(-1); 15 } 16 //2.绑定 17 struct sockaddr_in saddr; 18 //初始化 否则创建的变量会自动被赋予随机值 19 saddr.sin_family = AF_INET;//AF_INET 与 PF_INET值相等 20 //inet_pton(AF_INET, "192.168.192.128", saddr.sin_addr.s_addr);// 主机字节序转换为网络字节序 21 saddr.sin_addr.s_addr = INADDR_ANY; // 0.0.0.0 INADDR_ANY宏值为0 22 saddr.sin_port = htons(9999);//主机字节序9999通过 htons转换为网络字节序 23 int ret = bind(lfd, (struct sockaddr *)&saddr, sizeof(saddr)); 24 if(ret == -1) 25 { 26 perror("bind"); 27 exit(-1); 28 } 29 //3.监听 30 ret = listen(lfd, 8); 31 if(ret == -1) 32 { 33 perror("listen"); 34 exit(-1); 35 } 36 //4.接收客户端连接 37 struct sockaddr_in clientaddr;//客户端地址 38 socklen_t len = sizeof(clientaddr); 39 int cfd = accept(lfd, (struct sockaddr *)&clientaddr, &len); 40 if(cfd == -1) 41 { 42 perror("accept"); 43 exit(-1); 44 } 45 //输出客户端的信息 46 char clientIP[16]; 47 inet_ntop(AF_INET, &clientaddr.sin_addr.s_addr, clientIP, sizeof(clientIP)); 48 unsigned short clientPort = ntohs(clientaddr.sin_port); 49 printf("client ip is %s, port is %d\n", clientIP, clientPort); 50 //5.通信 51 //服务器端先接收数据后返回数据 52 //获取客户的数据 53 char recvBuf[1024] = {0}; 54 int len = read(cfd, recvBuf, sizeof(recvBuf)); 55 if( len == -1) 56 { 57 perror("read"); 58 exit(-1); 59 } 60 else if(len > 0) 61 { 62 printf("recv client data: %s\n",recvBuf); 63 } 64 else if( len == 0) 65 { 66 //表示客户端断开连接 67 printf("client closed...\n"); 68 } 69 //给客户端发送数据 70 char * data = "hello, i am server"; 71 write(cfd, data, strlen(data)); 72 //6.关闭文件描述符 73 close(cfd); 74 close(lfd); 75 return 0; 76 }
客户端:
1 //TCP通信的客户端 2 3 #include <stdio.h> 4 #include <arpa/inet.h> 5 #include <unistd.h> 6 #include <string.h> 7 #include <stdlib.h> 8 int main() 9 { 10 //1.创建套接字 11 int fd = socket(AF_INET, SOCK_STREAM, 0); 12 if(fd == -1) 13 { 14 perror("socket"); 15 exit(-1); 16 } 17 //2.连接服务器端 18 struct sockaddr_in serveraddr; 19 serveraddr.sin_family = AF_INET; 20 inet_pton(AF_INET, "10.0.8.5", &serveraddr.sin_addr.s_addr);//本机 ip 21 serveraddr.sin_port = htons(9999); 22 int ret = connect(fd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)); 23 if(ret == -1) 24 { 25 perror("connect"); 26 exit(-1); 27 } 28 //3.通信 29 char recvBuf[1024] = {0}; 30 while(1) 31 { 32 char * data = "hello, i am client"; 33 //给服务器端发送数据 34 write(fd, data, strlen(data)); 35 sleep(1); 36 //读取数据 37 int len = read(fd, recvBuf, sizeof(recvBuf)); 38 if(len == -1) 39 { 40 perror("read"); 41 exit(-1); 42 } 43 else if(len > 0) 44 { 45 printf("recv server data: %s\n",recvBuf); 46 } 47 else if(len == 0) 48 { 49 //表示客户端断开连接 50 printf("server closed...\n"); 51 break; 52 } 53 } 54 //关闭连接 55 close(fd); 56 return 0; 57 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2021-10-12 VS Code初下载--解决官网下载慢的问题