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-进程间通信(四): 域套接字的更多相关文章

  1. Linux进程间通信(四) - 共享内存

    共享内存的优势 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只 ...

  2. Linux进程间通信(九):数据报套接字 socket()、bind()、sendto()、recvfrom()、close()

    前一篇文章,Linux进程间通信——使用流套接字介绍了一些有关socket(套接字)的一些基本内容,并讲解了流套接字的使用,这篇文章将会给大家讲讲,数据报套接字的使用. 一.简单回顾——什么是数据报套 ...

  3. Linux进程间通信——使用数据报套接字

    前一篇文章, Linux进程间通信——使用流套接字介绍了一些有关socket(套接字)的一些基本内容,并讲解了流套接字的使用,这篇文章将会给大家讲讲,数据报套接字的使用. 一.简单回顾——什么是数据报 ...

  4. Linux进程间通信(四):命名管道 mkfifo()、open()、read()、close()

    在前一篇文章—— Linux进程间通信 -- 使用匿名管道 中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关 ...

  5. Linux进程间通信(八):流套接字 socket()、bind()、listen()、accept()、connect()、read()、write()、close()

    前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程.通常我们使用socket进行网络编 ...

  6. 高级进程间通信之UNIX域套接字

    UNIX域套接字用于在同一台机器上运行的进程之间的通信.虽然因特网域套接字可用于同一目的,但UNIX域套接字的效率更高.UNIX域套接字仅仅复制数据:它们并不执行协议处理,不需要添加或删除网络报头,无 ...

  7. Linux进程间通信——使用流套接字

    前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程.通常我们使用socket进行网络编 ...

  8. Linux进程间通信—套接字

    六.套接字(socket) socket也是一种进程间的通信机制,不过它与其他通信方式主要的区别是:它可以实现不同主机间的进程通信.一个套接口可以看做是进程间通信的端点(endpoint),每个套接口 ...

  9. Linux进程间通信:管道,信号量,消息队列,信号,共享内存,套接字

    Linux下的进程通信手段基本上是从UNIX平台上的进程通信手段继承而来的.而对UNIX发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间 ...

  10. Linux 进程间通信(二)(网络IPC:套接字)

    socket描述符 套接字是通信端点的抽象,创建一个套接字使用如下函数: #include <sys/socket.h> int socket(int domain, int type, ...

随机推荐

  1. [剑指Offer] 60.把二叉树打印成多行

    题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. [思路]使用队列实现二叉树的层次遍历. /* struct TreeNode { int val; struct TreeN ...

  2. 【bzoj1782】[Usaco2010 Feb]slowdown 慢慢游 树链剖分+线段树

    题目描述 每天Farmer John的N头奶牛(1 <= N <= 100000,编号1…N)从粮仓走向他的自己的牧场.牧场构成了一棵树,粮仓在1号牧场.恰好有N-1条道路直接连接着牧场, ...

  3. 【bzoj3036】绿豆蛙的归宿 期望dp

    题目描述 随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度.绿豆蛙从起点出发,走向终点.到达每一个顶点时,如 ...

  4. nopi导出

    1.NPOI官方网站:http://npoi.codeplex.com/ 可以到此网站上去下载最新的NPOI组件版本 2.NPOI在线学习教程(中文版): http://www.cnblogs.com ...

  5. Android <Android应用开发实战> 资源类型<二>

    1.菜单资源菜单不仅可以在onCreateContextMenu或onCreateOptionsMenu方法中通过代码创建,还可以在res/menu目录中建立相应的菜单资源文件,并在上面两个方法中加载 ...

  6. 【BZOJ5297】【CQOI2018】社交网络(矩阵树定理)

    [BZOJ5297][CQOI2018]社交网络(矩阵树定理) 题面 BZOJ 洛谷 Description 当今社会,在社交网络上看朋友的消息已经成为许多人生活的一部分.通常,一个用户在社交网络上发 ...

  7. 爆款PHP面试题

    $a = 3; $b = 6; if ($a = 4 || $b = 4) { $a++; $b++; } echo $a; //输出 1 echo $b; //输出 7 逛鸟哥博客,看评论区有个新手 ...

  8. JavaScript转换与解析JSON的方法

    在JavaScript中将JSON的字符串解析成JSON数据格式,一般有两种方式: 一种为使用eval()函数. 使用Function对象来进行返回解析. 使用eval函数来解析,jquery的eac ...

  9. java oracle clob string 大字符串存储【转】

    单位用到了oracle存储string类型到数据库里的clob,上网查看资料找到解决方案.如下: public class ClobTest { static String url = "j ...

  10. 洛谷P3178 [HAOI2015]树上操作(dfs序+线段树)

    P3178 [HAOI2015]树上操作 题目链接:https://www.luogu.org/problemnew/show/P3178 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边 ...