欢迎访问个站,你想要的,可能这里有

首页_码到城攻码到城攻分享但不限于IT技术经验技巧、软硬资源、所闻所见所领会等,站点提供移动阅读、文章搜索、在线留言、支付打赏、个人中心、免签支付等功能https://www.codecomeon.com/index

Linux下socketpair介绍:

socketpair创建了一对无名的套接字描述符(只能在AF_UNIX域中使用),描述符存储于一个二元数组,例如sv[2] .这对套接字可以进行双工通信,每一个描述符既可以读也可以写。这个在同一个进程中也可以进行通信,向sv[0]中写入,就可以从sv[1]中读取(只能从sv[1]中读取),也可以在sv[1]中写入,然后从sv[0]中读取;但是,若没有在0端写入,而从1端读取,则1端的读取操作会阻塞,即使在1端写入,也不能从1读取,仍然阻塞;

Linux实现了一个源自BSD的socketpair调用,可以实现在同一个文件描述符中进行读写的功能。该系统调用能创建一对已连接的UNIX族socket。在Linux中,完全可以把这一对socket当成pipe返回的文件描述符一样使用,唯一的区别就是这一对文件描述符中的任何一个都可读和可写,函数原型如下

<span style="font-size:18px;">int socketpair(int d, int type, int protocol, int sv[2]);</span>
参数介绍:
socketpair()函数建立一对匿名的已经连接的套接字,其特性由协议族d、类型type、协议protocol决定,建立的两个套接字描述符会放在sv[0]和sv[1]中。
第1个参数d,表示协议族,只能为AF_LOCAL或者AF_UNIX;
第2个参数type,表示类型,只能为0。
第3个参数protocol,表示协议,可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STREAM建立的套接字对是管道流,与一般的管道相区别的是,套接字对建立的通道是双向的,即每一端都可以进行读写。参数sv,用于保存建立的套接字对。
看源码:
/**进程双向通信*/
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>int main()
{int sv[2];    //一对无名的套接字描述符if(socketpair(PF_LOCAL,SOCK_STREAM,0,sv) < 0)   //成功返回零 失败返回-1{perror("socketpair");return 0;}pid_t id = fork();        //fork出子进程if(id == 0)               //孩子{//close(sv[0]); //在子进程中关闭读close(sv[1]); //在子进程中关闭读const char* msg = "我是孩子\n";char buf[1024];while(1){// write(sv[1],msg,strlen(msg));write(sv[0],msg,strlen(msg));sleep(1);//ssize_t _s = read(sv[1],buf,sizeof(buf)-1);ssize_t _s = read(sv[0],buf,sizeof(buf)-1);if(_s > 0){buf[_s] = '\0';printf("孩子说 : %s\n",buf);}}}else   //父亲{//close(sv[1]);//关闭写端口close(sv[0]);//关闭写端口const char* msg = "我是父亲\n";char buf[1024];while(1){//ssize_t _s = read(sv[0],buf,sizeof(buf)-1);ssize_t _s = read(sv[1],buf,sizeof(buf)-1);if(_s > 0){buf[_s] = '\0';printf("父亲说 : %s\n",buf);sleep(1);}// write(sv[0],msg,strlen(msg));write(sv[1],msg,strlen(msg));}}return 0;
}
这里只是代码,整体流程,意思就是,父子进程间正在全双工通信,个人理解即就是同时通信。

代码中有两行一样,一行被注释掉了,这正是说明博文第一段中的话:

“向sv[0]中写入,就可以从sv[1]中读取(只能从sv[1]中读取),也可以在sv[1]中写入,然后从sv[0]中读取”

整个流程就是,子进程写父进程读和父进程写子进程读同时在进行:上一张图看看:


截取一段代码,两个红色线的方向,都是从一个进程的写到另一个进程的读,同时进行,看运行结果:

打印时,成对打印,双向通信!

赐教!


socketpair创建双向通信的管道(全双工通信)相关推荐

  1. socketpair(双向通信)--高级IO

    一.五种IO模型 1. 阻塞I/O (eg:钓鱼者(王一)只钓鱼,不和任何人说话,也不干任何其他的事) 2.非阻塞I/O (eg:钓鱼者(王二)一边钓鱼,一边问王一到底钓了多少鱼,但是王一并没有回答他 ...

  2. Linux-C语言-利用有名管道简单实现两个进程间的全双工通信

    有名管道特点: 1.有名管道是对无名管道的改进,它可以使互不相关的两个进程互相通信,并且在文件系统中可见,可以通过文件名来找到. 2.半双工的通信方式,进程通过文件IO来操作有名管道. 3.有名管道遵 ...

  3. python socket双向通信_Python socket实现多对多全双工通信的方法

    服务器:#server.py #!/usr/bin/env python #-*-coding:utf-8-*- import sys import struct#将字符串打包为二进制流进行网络传输 ...

  4. 客户端和服务器实现全双工通信(基于线程)

    http://blog.sina.com.cn/s/blog_87766e4a0100yp7a.html 1. 基于多线程实现一个服务器和一个客户端实现全双工通信 服务器端创建两个线程:一个用于接收客 ...

  5. 单工通信、半双工通信、全双工通信 的概念

    ps: 如果有任何问题可以评论留言,我看到后会及时解答,评论或关注,您的鼓励是我分享的最大动力 转载请注明出处:https://blog.csdn.net/qq_40938301/article/de ...

  6. 一文了解websocket全双工通信java实现socket地址404问题解决

    websocket介绍 1.websocket介绍 1.1注解介绍 2.demo 2.1 后端代码 2.2 前端代码 2.3 效果 附录:socket地址404问题解决 1.websocket介绍 W ...

  7. USART串口全双工与SPI全双工通信的区别!

    目录 1.背景知识 2.SPI的全双工同通信 3.串口USART的全双工通信 背景知识 首先我们先来区分一下单工.半双工.全双工模式. 单工:数据传输只支持数据在一个方向上传输 半双工:允许数据传输在 ...

  8. 本地对弈五子棋(以命名管道进行通信)

    初步的界面如下: 为了实现不同的窗口.不同进程弈五子棋对弈,就需要在不同进程间的进行通信,我们采用linux底层的命名管道进行通信. 首先我们要进行管道通信头文件的包含.传输数据的结构定义.数据通信操 ...

  9. Spring MVC(11):通过 WebSocket 实现前后端全双工通信

    Spring WebSocket 支持 通常应用程序之间交换信息会使用如 JMS.AMQP 等技术,但是它们都无法实现浏览器客户端和服务器之间的全双工通信,基于 HTML5 的 WebSocket 协 ...

最新文章

  1. swift string转int_Swift进阶二:基本数据类型相关
  2. Processing Orders With Windows Workflow
  3. SDCC 2015算法专场札记:知名互联网公司的算法实践
  4. Golang 之 Base62 编码
  5. 常见MOS管型号及参数对照表
  6. Context 之我见
  7. 一些很好的工具软件~
  8. cdr怎么转plt_win10系统怎么将cdr格式转换成plt?win10将cdr格式转换成plt的方法
  9. 第五代移动通信——5G
  10. 古诗词干货整理: 春、夏、秋、冬、山、水、日、月、风、花、雨、雪(简直太全了)
  11. 微信奇销36计 赖老师
  12. 程序员需要的日常(收费)软件(都免费)
  13. radius系列:freeradius测试
  14. 用安卓手机控制 HomeKit 智能设备?绿米Aqara设备接入智汀家庭云保姆级教程
  15. oracle ldom ipmp,在 Oracle VM Server for SPARC 虚拟网络中使用基于链路的 IPMP
  16. Hugo 博客搭建教程
  17. snakeyaml 简介、中文文档、中英对照文档 下载
  18. 数千名学者唾弃Nature的新付费访问机器学习期刊
  19. ubuntu 安装 LiveSuit 刷机工具
  20. VirtualBox Ubuntu20.04 网络设置

热门文章

  1. linux 邮件内容换行,linux----回车换行
  2. HTML+CSS中常见的几种居中方式
  3. 流程引擎课堂(二)| 基于开源流程引擎开发的BPM有那些难点?
  4. ZBrush建模很难么?那是没找到技巧!盘点八十个3DMAX常见的问题,小白珍藏系列
  5. 15.使用ref比reactive更好的几种场景
  6. Android开机自启动C程序调试
  7. 【转】USB--设备、配置、接口、端点
  8. stm32f1串口发送与接收
  9. 威速(v2), 大IT公司的销售经验, 软件代理机制, 代理协议...
  10. 算法:动态规划经典题目