您的位置:首页 > 大数据 > 人工智能

高级I/O-----socketpair

2016-05-29 18:36 465 查看
socketpair
socketpair:相比较之前提到的管道,socketpair是一个全双工的通信方式,它的一端即可以读也可以写,对于它我是这样理解的:



假设现在我们是在本地使用socketpair的,客户端为fd[0],服务器端为fd[1],当服务器向客户端写数据时,从fd[1]的写端写入数据,而从fd[1]的读端读取数据,反之从客户端上的操作也是如此。

下面是实现的一个socketpair版本地进程间通信
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

int socketpair(int domain, int type, int protocol, int sv[2]);


domian为操作的方式,因为我们是本地所以用AF_LOCAL。
type为传输方式,我们采用tcp的流式服务,SOCK_STREAM。
protocol为控制,我们选择默认填0,
sv为要创建多少个文件描述符,注意(这个文件描述符是网络文件描述符,可以说他是虚拟的)。

1 #include<stdio.h>
2 #include<sys/types.h>
3 #include<sys/socket.h>
4 #include<unistd.h>
5 #include<string.h>
6 int main()
7 {
8     int fd[2];
9     if(socketpair(AF_LOCAL,SOCK_STREAM,0,fd)<0)
10     {
11         perror("socketpair");
12     }
13     char buf[1024];
14     pid_t id=fork();
15     if(id<0){
16         perror("fork");
17     }else if(id==0){
18         close(fd[0]);
19         while(1)
20         {
21             sleep(1);
22             memset(buf,'\0',sizeof(buf)-1);
23             strcpy(buf,"child hello world");
24             write(fd[1],buf,strlen(buf)+1);
25             ssize_t size=read(fd[1],buf,sizeof(buf)-1);
26             if(size>0)
27             {
28                 buf[size]='\0';
29                 printf("parents say::%s\n",buf);
30             }
31         }
32             close(fd[1]);
33     }
34     else{
35             close(fd[1]);
36             while(1)
37             {
38                 sleep(2);
39                 ssize_t size=read(fd[0],buf,sizeof(buf)-1);
40                 if(size>0)
41                 {
42                     buf[size]='\0';
43                     printf("child say::%s\n",buf);
44                 }
45                 memset(buf,'\0',sizeof(buf));
46                 strcpy(buf,"parent hello world");
47                 write(fd[0],buf,strlen(buf)+1);
48             }
49             close(fd[0]);
50
51     }
52
53     return 0;
54 }

socketpair实现了全双工的通信方式。

本文出自 “痕迹” 博客,请务必保留此出处http://wpfbcr.blog.51cto.com/10696766/1784271
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: