跨进程通讯之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 //再运行客户端

相关推荐
艾莉丝努力练剑2 小时前
【Linux权限 (二)】Linux权限机制深度解析:umask如何决定默认权限与粘滞位的妙用
大数据·linux·服务器·c++·ubuntu·centos·1024程序员节
shan~~3 小时前
ubuntu系统安装elasticsearch
ubuntu·elasticsearch·jenkins
虚伪的空想家3 小时前
HUAWEI A800I A2 aarch64架构Ubuntu服务器鲲鹏920开启 IOMMU/SMMU 硬件虚拟化功能
linux·服务器·ubuntu
Postkarte不想说话4 小时前
FreeBSD启用IPFW防火墙
unix
2501_9387820917 小时前
《Ubuntu 系统下 MySQL 安装前的环境检查与依赖准备指南》
hive·mysql·ubuntu·adb
FreeBuf_17 小时前
Ubuntu内核曝严重UAF漏洞,可致攻击者获取Root权限
linux·运维·ubuntu
gfdgd xi20 小时前
GXDE For deepin 25:deepin25 能用上 GXDE 了!
linux·运维·python·ubuntu·架构·bug·deepin
skywalk81631 天前
windows装wsl ubuntu24.04 ,里面装qemu ,然后装mac os (windows也可以直接qemu安装macos)(未实践)
windows·ubuntu·macos·qemu
百步送剑1 天前
在 Ubuntu 环境下 sh 脚本运行因为 Bash 改用 Dash 语法报错问题
ubuntu·bash·dash
搬砖的小码农_Sky1 天前
Ubuntu Server 命令行关机指南
linux·运维·ubuntu