跨进程通讯之Unix Socket通讯

1、unix_client.c代码

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #include <stdlib.h> #include <stdio.h> #include <stddef.h> #include <sys/socket.h> #include <sys/un.h> #include <errno.h> #include <string.h> #include <unistd.h> #define MAXLINE 80 char *client_path = "client-socket"; char *server_path = "server-socket"; int main() { struct sockaddr_un cliun, serun; int len; char buf[100]; int sockfd, n; if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){ perror("client socket error"); exit(1); } memset(&serun, 0, sizeof(serun)); serun.sun_family = AF_UNIX; strncpy(serun.sun_path,server_path , sizeof(serun.sun_path) - 1); if (connect(sockfd, (struct sockaddr *)&serun, sizeof(struct sockaddr_un)) < 0){ perror("connect error"); exit(1); } printf("please input send char:"); while(fgets(buf, MAXLINE, stdin) != NULL) { write(sockfd, buf, strlen(buf)); n = read(sockfd, buf, MAXLINE);//读不到了就为0 if ( n <= 0 ) { printf("the other side has been closed.\n"); break; }else { printf("received from server: %s \n",buf); } printf("please input send char:"); } close(sockfd); return 0; } |

2、unix_socket.c代码

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #include <stdlib.h> #include <stdio.h> #include <stddef.h> #include <sys/socket.h> #include <sys/un.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <ctype.h> #define MAXLINE 80 char *socket_path = "server-socket"; int main() { struct sockaddr_un serun, cliun; socklen_t cliun_len; int listenfd, connfd, size; char buf[MAXLINE]; int i, n; if ((listenfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { perror("socket error"); exit(1); } memset(&serun, 0, sizeof(serun)); serun.sun_family = AF_UNIX; strncpy(serun.sun_path,socket_path , sizeof(serun.sun_path) - 1); unlink(socket_path);//这个相当于把之前的地址要移除,不然上一个server没有结束,移除会报错already in use if (bind(listenfd, (struct sockaddr *)&serun, sizeof(struct sockaddr_un)) < 0) { perror("bind error"); exit(1); } printf("UNIX domain socket bound\n"); if (listen(listenfd, 20) < 0) { perror("listen error"); exit(1); } printf("Accepting connections ...\n"); while(1) { cliun_len = sizeof(cliun); if ((connfd = accept(listenfd, (struct sockaddr *)&cliun, &cliun_len)) < 0){ perror("accept error"); continue; } printf("new client connect to server,client sockaddr === %s \n",((struct sockaddr *)&cliun)->sa_data); while(1) { memset(buf,0,sizeof(buf)); n = read(connfd, buf, sizeof(buf)); if (n < 0) { perror("read error"); break; } else if(n == 0) { printf("EOF\n"); break; } printf("received: %s\n", buf); if(strncmp(buf,"quit",4)==0){ break; } for(i = 0; i < n; i++) { buf[i] = toupper(buf[i]); } write(connfd, buf, n); } close(connfd); } close(listenfd); return 0; } |

3、命令

编译:

gcc unix_client.c -o unix_client

gcc unix_socket.c -o unix_socket

运行:

./unix_socket //先运行服务端,服务端运行起来,客户端才能连接

./unix_client //再运行客户端

相关推荐
xiaobobo33302 分钟前
ubuntu14.04搭建Samba服务器实现文件共享
ubuntu·samba·共享文件夹
LN花开富贵15 小时前
Ubuntu aarch64 架构安装 NoMachine 远程控制 避坑与实战
linux·运维·笔记·学习·ubuntu·嵌入式
取经蜗牛15 小时前
Windows 11 WSL + Ubuntu 24.04 安装指南
linux·windows·ubuntu
bush419 小时前
linux开发板连接virtualbox虚拟机ubuntu的usb网卡,访问外网方法。
linux·运维·ubuntu
大明者省20 小时前
完整 Ubuntu 服务器 XFCE 桌面 + XRDP 远程桌面 部署使用全流程
运维·服务器·ubuntu
Irene199121 小时前
在 WSL Ubuntu 上安装和使用 Hive
linux·hive·ubuntu
ZGUIZ1 天前
Ubuntu 25.10 蓝牙Wifi不可用解决流程
linux·运维·ubuntu
Irene19911 天前
Windows 11 WSL Ubuntu 环境:安装 Hadoop 完整指南
hadoop·ubuntu
WangLanguager1 天前
Unix 命令 rm详细介绍
linux·服务器·unix
勤自省1 天前
ROS2 + OpenCV 实战教程:人脸识别、物体跟踪、ArUco 二维码识别初级
人工智能·opencv·ubuntu·计算机视觉·ros2