博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux-进程间通信(四): 域套接字
阅读量:5089 次
发布时间:2019-06-13

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

1. 域套接字:

(1) 只能用于同一设备上不同进程之间的通信;

(2) 效率高于网络套接字。域套接字仅仅是复制数据,并不走协议栈;

(3) 可靠,全双工;

 

2. 域套接字地址结构:

struct sockaddr_un {    sa_family_t sun_family; /*AF_UNIX*/    char sun_path[108]; /*pathname*/};

当我们将一个地址绑定至域套接字,系统用该路径名创建一个类型为S_IFSOCK的文件,尽告诉客户端名字,不能打开,也不能通信,

不会自动删除,需要程序完成后删除,若文件已存在则bind失败;

 

3. 测试代码:

server.c

1 #include 
2 #include
3 #include
4 #include
5 #include
6 7 #define UN_PATH "/var/tmp/test_domain_socket" 8 9 10 int main(int argc, char *argv[])11 {12 int sockfd = -1;13 struct sockaddr_un un;14 int len = 0;15 16 if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){17 perror("create socket error\n");18 goto _ERROR;19 }20 21 memset(&un, 0, sizeof(un));22 un.sun_family = AF_UNIX;23 strcpy(un.sun_path, UN_PATH);24 25 len = sizeof(un.sun_family) + sizeof(un.sun_path);26 27 if (bind(sockfd, (struct sockaddr *)&un, len) < 0){28 perror("socket bind error\n");29 goto _ERROR;30 }31 32 if (listen(sockfd, 5) < 0){33 perror("socket listen error\n");34 }35 36 int conn = accept(sockfd, (struct sockaddr *)&un, &len);37 if (conn < 0){38 perror("accept error\n");39 goto _ERROR;40 }41 char buf[64] = {
0};42 int n = read(conn, buf, 63);43 printf("recive-msg:%s", buf);44 write(conn, buf, n);45 close(conn);46 47 close(sockfd);48 unlink(UN_PATH);49 return 0;50 51 _ERROR:52 if (sockfd != -1){53 close(sockfd);54 }55 56 return -1;57 }

 

client.c

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 8 #define UN_PATH "/var/tmp/test_domain_socket" 9 10 11 int main(int argc, char *argv[])12 {13 int sockfd = -1;14 struct sockaddr_un un;15 int len = 0;16 17 if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){18 perror("create socket error\n");19 goto _ERROR;20 }21 22 memset(&un, 0, sizeof(un));23 un.sun_family = AF_UNIX;24 strcpy(un.sun_path, UN_PATH);25 26 len = sizeof(un.sun_family) + sizeof(un.sun_path);27 28 if (connect(sockfd, (struct sockaddr *)&un, len) < 0){29 perror("socket connect error\n");30 goto _ERROR;31 }32 33 char buf[64] = { 0};34 int n = read(STDIN_FILENO, buf, 63);35 write(sockfd, buf, n);36 printf("send-msg:%s", buf);37 read(sockfd, buf, 63);38 buf[64] = '\0';39 printf("recv-msg:%s", buf);40 41 close(sockfd);42 return 0;43 44 _ERROR:45 if (sockfd != -1){46 close(sockfd);47 }48 49 return -1;50 }

 

转载于:https://www.cnblogs.com/wanpengcoder/p/5303071.html

你可能感兴趣的文章
poj2752 Seek the Name, Seek the Fame
查看>>
软件开发和软件测试,我该如何选择?(蜗牛学院)
查看>>
基本封装方法
查看>>
bcb ole拖拽功能的实现
查看>>
生活大爆炸之何为光速
查看>>
bzoj 2456: mode【瞎搞】
查看>>
[Typescript] Specify Exact Values with TypeScript’s Literal Types
查看>>
[GraphQL] Reuse Query Fields with GraphQL Fragments
查看>>
Illustrated C#学习笔记(一)
查看>>
理解oracle中连接和会话
查看>>
两种最常用的Sticky footer布局方式
查看>>
Scrapy实战篇(三)之爬取豆瓣电影短评
查看>>
HDU 5510 Bazinga KMP
查看>>
[13年迁移]Firefox下margin-top问题
查看>>
Zookeeper常用命令 (转)
查看>>
Enterprise Library - Data Access Application Block 6.0.1304
查看>>
重构代码 —— 函数即变量(Replace temp with Query)
查看>>
Bootstrap栅格学习
查看>>
程序员的数学
查看>>
聚合与组合
查看>>