资讯动态

【2018-02-10】【转】Linux网络编程 -- socketpair的使用

发布时间:2026/10/1 2:50:23 来源:尧图企业网站定制
[历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2018-02-10 标题【转】Linux网络编程 – socketpair的使用分类操作系统 / linux 标签linux·socketpairlinux socketpair简单笔记本文转自【 http://blog.csdn.net/y396397735/article/details/50684558 】Linux实现了一个源自BSD的socketpair调用可以实现在同一个文件描述符中进行读写的功能。该系统调用能创建一对已连接的UNIX族socket。在Linux中完全可以把这一对socket当成pipe返回的文件描述符一样使用唯一的区别就是这一对文件描述符中的任何一个都可读和可写函数原型如下#includesys/types.h#includesys/socket.hintsocketpair(intdomain,inttype,intprotocol,intsv[2]);socketpair()函数建立一对匿名的已经连接的套接字其特性由协议族d、类型type、协议protocol决定建立的两个套接字描述符会放在sv[0]和sv[1]中。socketpair函数参数说明第1个参数domain表示协议族只能为AF_LOCAL或者AF_UNIX。第2个参数type表示协议可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STREAM建立的套接字对是管道流与一般的管道相区别的是套接字对建立的通道是双向的即每一端都可以进行读写。第3个参数protocol表示类型只能为0。第4个参数sv[2]是接收代表两个套接口的整数数组。每一个文件描述符代表一个套接口并且与另一个并没有区别。函数返回值如果函数成功将会返回0值。否则将会返回-1表明创建失败并且errno来表明特定的错误号。以下给出个简单的例子通过socketpair实现父子间进程通信/*socketpair1.c*/#includesys/types.h#includesys/socket.h#includestdlib.h#includestdio.hintmain(){intfd[2];intrsocketpair(AF_UNIX,SOCK_STREAM,0,fd);if(r0){perror(socketpair());exit(1);}if(fork()){/* 父进程 */intval0;close(fd[1]);while(1){sleep(1);val;printf(发送数据:%d ,val);write(fd[0],val,sizeof(val));read(fd[0],val,sizeof(val));printf(接收数据:%d ,val);}}else{/*子进程*/intval;close(fd[0]);while(1){read(fd[1],val,sizeof(val));val;write(fd[1],val,sizeof(val));}}}yuubuntu:~/Linux/217/pro_pool/socketpair$visocketpair1.c yuubuntu:~/Linux/217/pro_pool/socketpair$ gcc-osocketpair1 socketpair1.c yuubuntu:~/Linux/217/pro_pool/socketpair$ ./socketpair1 发送数据:1接收数据:2发送数据:3接收数据:4发送数据:5接收数据:6...分析程序一开始由socketpair创建一个套接字对父进程关闭fd[1]子进程关闭fd[0]父进程sleep(1)让子进程先执行子进程read(fd[1], val, sizeof(val))阻塞然后父进程write(fd[0]…)发送数据子进程接收数据处理后再发送给父进程数据write(fd[1]…)父进程读取数据打印输出。注意:socketpair产生的套接字对实现全双工通信

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑