linux 本地套接字通信
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事件本地套接字的作用:本地的进程间通信
有关系的进程间通信
没有关系的进程间的通信
本地套接字实现流程与网络套接字类似,一般采用 TCP 通信流程
本地套接字通信流程:
//服务器端 //1.创建监听的套接字 int lfd = socket(AF_UNIX/AF_LOCAL, SOCK_STREAM, 0); //2.监听的套接字绑定本地的套接字文件 -> server端 struct sockaddr_un addr; //绑定成功后,指定的 sun_path中的套接字文件会自动生成 bind(lfd, addr, len); //3.监听 listen(lfd, 100); //4.等待并接受连接请求 struct sockaddr_un cliaddr; int cfd = accept(lfd, cliaddr, len); //5.通信 接受数据: read/recv 发送数据: write/send //6.关闭连接 close(); //客户端流程 //1.创建通信的套接字 int fd = socket(AF_UNIX/AF_LOCAL, SOCK_STREAM, 0); //2.监听的套接字绑定本地的 IP 端口 struct sockaddr_un addr; //绑定成功之后,指定的sun_path中套接字文件会自动生成 bind(lfd, addr, len); //3.连接服务器 struct sockaddr_un serveraddr; connect(fd, &serveraddr, sizeof(serveraddr)); //4.通信 接受数据: read/recv 发送数据: write/send //5.关闭连接 close();
本地客户端:
1 #include <stdio.h> 2 #include <unistd.h> 3 #include <string.h> 4 #include <stdlib.h> 5 #include <arpa/inet.h> 6 #include <sys/un.h> 7 8 int main() 9 { 10 unlink("client.sock"); 11 //1.创建套接字 12 int cfd = socket(AF_LOCAL, SOCK_STREAM, 0); 13 if(cfd == -1) 14 { 15 perror("socket"); 16 exit(-1); 17 } 18 //2.绑定本地套接字文件 19 struct sockaddr_un addr; 20 addr.sun_family = AF_LOCAL; 21 strcpy(addr.sun_path, "client.sock"); 22 int ret =bind(cfd, (struct sockaddr *)&addr,sizeof(addr)); 23 if(ret == -1) 24 { 25 perror("bind"); 26 exit(-1); 27 } 28 //3.连接服务器 29 struct sockaddr_un seraddr; 30 seraddr.sun_family = AF_LOCAL; 31 strcpy(seraddr.sun_path, "server.sock"); 32 ret = connect(cfd, (struct sockaddr *)&seraddr, sizeof(seraddr)); 33 if(ret == -1) 34 { 35 perror("connect"); 36 exit(-1); 37 } 38 //4.通信 39 int num = 0; 40 while(1) 41 { 42 //发送数据 43 char buf[128]; 44 sprintf(buf, "hello, i am client: %d\n",num++); 45 send(cfd, buf, strlen(buf) + 1, 0); 46 printf("client say : %s\n", buf); 47 //接收数据 48 int len = recv(cfd, buf, sizeof(buf), 0); 49 if(len == -1) 50 { 51 perror("recv"); 52 exit(-1); 53 } 54 else if(len == 0) 55 { 56 printf("server closed...\n"); 57 break; 58 } 59 else if(len > 0) 60 { 61 printf("server say : %s\n", buf); 62 send(cfd, buf, len, 0); 63 } 64 sleep(1); 65 } 66 close(cfd); 67 return 0; 68 }
本地服务器端:
1 #include <stdio.h> 2 #include <unistd.h> 3 #include <string.h> 4 #include <stdlib.h> 5 #include <arpa/inet.h> 6 #include <sys/un.h> 7 8 int main() 9 { 10 unlink("server.sock");//删除此文件 不删除重新连接报错地址已经使用 11 //1.创建监听的套接字 12 int lfd = socket(AF_LOCAL, SOCK_STREAM, 0); 13 if(lfd == -1) 14 { 15 perror("socket"); 16 exit(-1); 17 } 18 //2.绑定本地套接字文件 19 struct sockaddr_un addr; 20 addr.sun_family = AF_LOCAL; 21 strcpy(addr.sun_path, "server.sock"); 22 int ret =bind(lfd, (struct sockaddr *)&addr,sizeof(addr)); 23 if(ret == -1) 24 { 25 perror("bind"); 26 exit(-1); 27 } 28 //3.监听 29 ret = listen(lfd, 100); 30 if(ret == -1) 31 { 32 perror("listen"); 33 exit(-1); 34 } 35 //4.等待客户端连接 36 struct sockaddr_un cliaddr; 37 int len = sizeof(cliaddr); 38 int cfd = accept(lfd, (struct sockaddr *)&cliaddr, &len); 39 if(cfd == -1) 40 { 41 perror("accept"); 42 exit(-1); 43 } 44 printf("client socket filename: %s\n",cliaddr.sun_path); 45 //5.通信 46 while(1) 47 { 48 char buf[128]; 49 int len = recv(cfd, buf, sizeof(buf), 0); 50 if(len == -1) 51 { 52 perror("recv"); 53 exit(-1); 54 } 55 else if(len == 0) 56 { 57 printf("client closed...\n"); 58 break; 59 } 60 else if(len > 0) 61 { 62 printf("client say : %s\n", buf); 63 send(cfd, buf, len, 0); 64 } 65 } 66 close(cfd); 67 close(lfd); 68 return 0; 69 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了