Linux-进程间通信(四): 域套接字
1. 域套接字:
(1) 只能用于同一设备上不同进程之间的通信;
(2) 效率高于网络套接字。域套接字仅仅是复制数据,并不走协议栈;
(3) 可靠,全双工;
2. 域套接字地址结构:
struct sockaddr_un {
sa_family_t sun_family; /*AF_UNIX*/
char sun_path[]; /*pathname*/
};
当我们将一个地址绑定至域套接字,系统用该路径名创建一个类型为S_IFSOCK的文件,尽告诉客户端名字,不能打开,也不能通信,
不会自动删除,需要程序完成后删除,若文件已存在则bind失败;
3. 测试代码:
server.c
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <stdlib.h> #define UN_PATH "/var/tmp/test_domain_socket" int main(int argc, char *argv[])
{
int sockfd = -;
struct sockaddr_un un;
int len = ; if ((sockfd = socket(AF_UNIX, SOCK_STREAM, )) < ){
perror("create socket error\n");
goto _ERROR;
} memset(&un, , sizeof(un));
un.sun_family = AF_UNIX;
strcpy(un.sun_path, UN_PATH); len = sizeof(un.sun_family) + sizeof(un.sun_path); if (bind(sockfd, (struct sockaddr *)&un, len) < ){
perror("socket bind error\n");
goto _ERROR;
} if (listen(sockfd, ) < ){
perror("socket listen error\n");
} int conn = accept(sockfd, (struct sockaddr *)&un, &len);
if (conn < ){
perror("accept error\n");
goto _ERROR;
}
char buf[] = {};
int n = read(conn, buf, );
printf("recive-msg:%s", buf);
write(conn, buf, n);
close(conn); close(sockfd);
unlink(UN_PATH);
return ; _ERROR:
if (sockfd != -){
close(sockfd);
} return -;
}
client.c
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> #define UN_PATH "/var/tmp/test_domain_socket" int main(int argc, char *argv[])
{
int sockfd = -;
struct sockaddr_un un;
int len = ; if ((sockfd = socket(AF_UNIX, SOCK_STREAM, )) < ){
perror("create socket error\n");
goto _ERROR;
} memset(&un, , sizeof(un));
un.sun_family = AF_UNIX;
strcpy(un.sun_path, UN_PATH); len = sizeof(un.sun_family) + sizeof(un.sun_path); if (connect(sockfd, (struct sockaddr *)&un, len) < ){
perror("socket connect error\n");
goto _ERROR;
} char buf[] = {};
int n = read(STDIN_FILENO, buf, );
write(sockfd, buf, n);
printf("send-msg:%s", buf);
read(sockfd, buf, );
buf[] = '\0';
printf("recv-msg:%s", buf); close(sockfd);
return ; _ERROR:
if (sockfd != -){
close(sockfd);
} return -;
}
Linux-进程间通信(四): 域套接字的更多相关文章
- Linux进程间通信(四) - 共享内存
共享内存的优势 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只 ...
- Linux进程间通信(九):数据报套接字 socket()、bind()、sendto()、recvfrom()、close()
前一篇文章,Linux进程间通信——使用流套接字介绍了一些有关socket(套接字)的一些基本内容,并讲解了流套接字的使用,这篇文章将会给大家讲讲,数据报套接字的使用. 一.简单回顾——什么是数据报套 ...
- Linux进程间通信——使用数据报套接字
前一篇文章, Linux进程间通信——使用流套接字介绍了一些有关socket(套接字)的一些基本内容,并讲解了流套接字的使用,这篇文章将会给大家讲讲,数据报套接字的使用. 一.简单回顾——什么是数据报 ...
- Linux进程间通信(四):命名管道 mkfifo()、open()、read()、close()
在前一篇文章—— Linux进程间通信 -- 使用匿名管道 中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关 ...
- Linux进程间通信(八):流套接字 socket()、bind()、listen()、accept()、connect()、read()、write()、close()
前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程.通常我们使用socket进行网络编 ...
- 高级进程间通信之UNIX域套接字
UNIX域套接字用于在同一台机器上运行的进程之间的通信.虽然因特网域套接字可用于同一目的,但UNIX域套接字的效率更高.UNIX域套接字仅仅复制数据:它们并不执行协议处理,不需要添加或删除网络报头,无 ...
- Linux进程间通信——使用流套接字
前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程.通常我们使用socket进行网络编 ...
- Linux进程间通信—套接字
六.套接字(socket) socket也是一种进程间的通信机制,不过它与其他通信方式主要的区别是:它可以实现不同主机间的进程通信.一个套接口可以看做是进程间通信的端点(endpoint),每个套接口 ...
- Linux进程间通信:管道,信号量,消息队列,信号,共享内存,套接字
Linux下的进程通信手段基本上是从UNIX平台上的进程通信手段继承而来的.而对UNIX发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间 ...
- Linux 进程间通信(二)(网络IPC:套接字)
socket描述符 套接字是通信端点的抽象,创建一个套接字使用如下函数: #include <sys/socket.h> int socket(int domain, int type, ...
随机推荐
- React & event-pooling & bug
React & event-pooling & bug event-pooling https://reactjs.org/docs/events.html#event-pooling ...
- HtmlHelper扩展实例
namespace System.Web.Mvc{ public static class MyHttpHelperExt { public static string MyLabel( ...
- Luogu4899 IOI2018狼人(kruskal重构树+主席树)
可以发现询问的即是“由起点开始‘只经过编号大于等于l的点’所形成的连通块”与“由终点开始‘只经过编号小于等于r的点’所形成的连通块”是否有交集.于是建出重构树,就可以知道每个询问的连通情况了.现在要知 ...
- BZOJ5290 & 洛谷4438:[HNOI/AHOI2018]道路——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5290 https://www.luogu.org/problemnew/show/P4438 的确 ...
- BZOJ1499:[NOI2005]瑰丽华尔兹——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1499 舞厅是一个N行M列的矩阵,矩阵中的某些方格上堆放了一些家具,其他的则是空地.钢琴可以在空地上滑 ...
- BZOJ3052 & UOJ58:[WC2013]糖果公园——题解
http://uoj.ac/problem/58 http://www.lydsy.com/JudgeOnline/problem.php?id=3052 输入格式 输出格式 input 4 3 5 ...
- 实验三 Java敏捷开发与XP实践
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1353 姓名:陈巧然 ...
- 51nod 1215 数组的宽度&poj 2796 Feel Good(单调栈)
单调栈求每个数在哪些区间是最值的经典操作. 把数一个一个丢进单调栈,弹出的时候[st[top-1]+1,i-1]这段区间就是弹出的数为最值的区间. poj2796 弹出的时候更新答案即可 #inclu ...
- Ubuntu16.04+Cuda8.0+1080ti+caffe+免OpenCV3.2.0+faster-rCNN教程
一.事先声明:1.Ubuntu版本:Ubuntu使用的是16.04.而不是16.04.1或16.04.2,这三个是有区别的.笔者曾有过这样的经历,Git上一个SLAM地图构建程序在Ubuntu14.0 ...
- ringbuffer
http://blog.csdn.net/xiaolang85/article/details/38419163