千家信息网

高级I/O-----socketpair

发表于:2024-11-20 作者:千家信息网编辑
千家信息网最后更新 2024年11月20日,socketpairsocketpair:相比较之前提到的管道,socketpair是一个全双工的通信方式,它的一端即可以读也可以写,对于它我是这样理解的:假设现在我们是在本地使用socketpair
千家信息网最后更新 2024年11月20日高级I/O-----socketpair

socketpair

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


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


下面是实现的一个socketpair版本地进程间通信

       #include           /* See NOTES */       #include        int socketpair(int domain, int type, int protocol, int sv[2]);


domian为操作的方式,因为我们是本地所以用AF_LOCAL。

type为传输方式,我们采用tcp的流式服务,SOCK_STREAM。

protocol为控制,我们选择默认填0,

sv为要创建多少个文件描述符,注意(这个文件描述符是网络文件描述符,可以说他是虚拟的)。


  1 #include  2 #include  3 #include  4 #include  5 #include  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实现了全双工的通信方式。


0