博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux IPC: UNIX Domain Socket 基本用法
阅读量:4207 次
发布时间:2019-05-26

本文共 2711 字,大约阅读时间需要 9 分钟。

当前Linux IPC最常用的方法就是UNIX Domain Socket和TCP Socket了。TCP Socket的基本用法可以看:。这两种IPC一个很大的区别就是:

  • TCP使用IP + Port来标记进程;
  • UNIX Domain Socket使用文件来标记进程;

由于上面差异,在Socket API标记地址的结构体也有所不同,Domain Socket的结构体是struct sockaddr_un,里面包含了一个文件路径,这个路径就是用来标记进程的。下面,用一个例子来说明:

服务端

#include 
#include
#include
#include
#include
#include
#define SOCK_SERV "/root/server_sock"int main(){ int fd, connfd, size, ret; struct sockaddr_un un; char buff[20] = { 0}; char *msg = "Welcome, client!\n"; size_t msglen = strlen(msg) + 1; memset(&un, 0, sizeof(un)); un.sun_family = AF_UNIX; strcpy(un.sun_path, SOCK_SERV); fd = socket(AF_UNIX, SOCK_STREAM, 0); if (fd < 0) goto fail; size = offsetof(struct sockaddr_un, sun_path) + strlen(un.sun_path); ret = bind(fd, (struct sockaddr *)&un, size) < 0; if (ret < 0) goto fail; ret = listen(fd, 10); if (ret < 0) goto fail; printf("server listen...\n"); while (1) { socklen_t len = sizeof(un); connfd = accept(fd, (struct sockaddr *)&un, &len); if (connfd < 0) goto fail; printf("accept fd %d\n", connfd); recv(connfd, buff, sizeof(buff), 0); printf("recv %s", buff); send(connfd, msg, msglen, 0); printf("send %s", msg); close(connfd); } close(fd); return 0;fail: perror("error"); exit(1);}

客户端

#include 
#include
#include
#include
#include
#include
#define SOCK_CLI "/root/client_sock"#define SOCK_SERV "/root/server_sock"int main(){ struct sockaddr_un un; int fd, len, ret; fd = socket(AF_UNIX, SOCK_STREAM, 0); if (fd < 0) goto fail; memset(&un, 0, sizeof(un)); un.sun_family = AF_UNIX; strcpy(un.sun_path, SOCK_CLI); len = offsetof(struct sockaddr_un, sun_path) + strlen(un.sun_path); ret = bind(fd, (struct sockaddr *)&un, len); if (ret < 0) goto fail; memset(&un, 0, sizeof(un)); un.sun_family = AF_UNIX; strcpy(un.sun_path, SOCK_SERV); len = offsetof(struct sockaddr_un, sun_path) + strlen(SOCK_SERV); ret = connect(fd, (struct sockaddr *)&un, len); if (ret < 0) goto fail; char *msg = "Hi, server!\n"; char buff[20] = { 0}; size_t msglen = strlen(msg) + 1; send(fd, msg, msglen, 0); printf("send msg: %s", msg); recv(fd, buff, sizeof(buff), 0); printf("recv msg: %s", buff); close(fd); return 0;fail: perror("error"); exit(1);}

运行

一个简易的makefile如下,运行时在两个console窗口分别启动即可,注意如果socket文件历史已存在,就先删除掉。

CFLAGS = -Werror -WallCOMPILE = $(CC) $^ $(CFLAGS) -o $@.PHONY : allall : server.bin client.binserver.bin : server.c    $(COMPILE)client.bin : client.c    $(COMPILE).PHONY : cleanclean :    rm *.bin

就API的使用而言,Domain Socket和TCP Socket几乎差不多,甚至TCP Socket还更加方便一些,也方便以后跨主机扩展。就效率而言,本机TCP Socket通信,Linux做了很多优化,两者也差不了多少。所以个人还是倾向于用TCP进行IPC.

转载地址:http://nbqli.baihongyu.com/

你可能感兴趣的文章
从内核看epoll的实现(基于5.9.9)
查看>>
python与正则表达式
查看>>
安装.Net Framework 4.7.2时出现“不受信任提供程序信任的根证书中终止”的解决方法
查看>>
input type=“button“与input type=“submit“的区别
查看>>
解决Github代码下载慢问题!
查看>>
1.idea中Maven创建项目及2.对idea中生命周期的理解3.pom文件夹下groupId、artifactId含义
查看>>
LeetCode-栈|双指针-42. 接雨水
查看>>
stdin,stdout,stderr详解
查看>>
Linux文件和设备编程
查看>>
文件描述符
查看>>
终端驱动程序:几个简单例子
查看>>
登录linux密码验证很慢的解决办法
查看>>
fcntl函数总结
查看>>
HTML条件注释
查看>>
Putty远程服务器的SSH经验
查看>>
内核态与用户态
查看>>
使用mingw(fedora)移植virt-viewer
查看>>
趣链 BitXHub跨链平台 (4)跨链网关“初介绍”
查看>>
C++ 字符串string操作
查看>>
MySQL必知必会 -- 了解SQL和MySQL
查看>>