高级I/O-----socketpair

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实现了全双工的通信方式。

时间: 2024-10-10 09:06:58

高级I/O-----socketpair的相关文章

高级IO中socketpair实现进程间通信以及重定向

sockpair实现进程间通信 我们以前学习的利用管道(此处为匿名管道)实现进程间通信,只能是单向的,一边只能读而另一边只能写,且只能在有血缘关系的进程间才能通信,若想实现双向通信就必须创建双向管道,而sockpair它的实现就是双向管道进行通信.它可以用来创建双向通信管道 1 #include<stdio.h>   2 #include<unistd.h>   3 #include<string.h>   4 #include<sys/types.h>  

python开发学习-day08(socket高级、socketserver、进程、线程)

s12-20160305-day08 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin

Linux高性能server编程——高级I/O函数

 高级I/O函数 pipe函数 pipe函数用于创建一个管道,实现进程间的通信. #include <unistd.h> int pipe(int pipefd[2]); 通过pipe函数创建的文件描写叙述符fd[0]和fd[1]分别构成管道的两端,往fd[1]写入的数据能够从fd[0]读出,不能反过来.管道内部传输的数据时字节流,和TCP字节流概念同样,但有差别,管道本身拥有一个容量限制,它规定假设应用程序不将数据从管道读走的话,该管道最多能被写入多少字节的数据.管道容量阿东小默认是65

高级IO编程

一.5种I/O模型 一个I/O可以分为两个过程:等待和数据搬迁. 1.阻塞I/O 两个过程都有自己来完成,其他什么事也不做. 2.非阻塞I/O 在等的过程中可以干一些其他的事,等到数据准备好再进行搬迁 3.信号驱动I/O 等数据准备好的过程由信号来触发,在这期间自己可以干一些别的事 4.I/O复用 同时阻塞多个I/O操作,谁数据准备好就对其进行数据搬迁. 5.异步I/O 将任务派发,不用自己来完成.完成之后通知自己就行. 二.高级I/O 非阻塞IO,纪录锁,系统V流机制,I/O多路转接(sele

Python之路,Day8 - Python基础 面向对象高级进阶与socket基础

类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份. 一.字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 普通字段属于对象 静态字段属于类 class Province: # 静态字段 country = '中国'def __init__(self, name): #

Linux高级进程间通信:UNIX域套接字

UNIX域套接字简介 UNIX域套接字用于在同一台机器上运行的进程间的通信.虽然因特网域套接字可用于同一目的,但UNIX域套接字的效率更高.UNIX域套接字仅仅复制数据,它们并不执行协议处理,不需要添加和删除网络报头,无需计算检验和,不要产生顺序号,无需发送确认报文. UNIX域套接字提供流和数据报两种接口.UNIX域数据报服务是可靠的,既不会丢失消息也不会传递错误.UNIX域套接字是套接字和管道之间的混合物.为了创建一对非命名的.相互连接的UNIX域套接字,用户可以使用它们面向网络的域套接字接

Linux高性能服务器编程——高级I/O函数

 高级I/O函数 pipe函数 pipe函数用于创建一个管道,实现进程间的通信. #include <unistd.h> int pipe(int pipefd[2]); 通过pipe函数创建的文件描述符fd[0]和fd[1]分别构成管道的两端,往fd[1]写入的数据可以从fd[0]读出,不能反过来.管道内部传输的数据时字节流,和TCP字节流概念相同,但有区别,管道本身拥有一个容量限制,它规定如果应用程序不将数据从管道读走的话,该管道最多能被写入多少字节的数据.管道容量阿东小默认是6553

apue学习笔记(第十七章 高级进程间通信)

本章介绍一种高级IPC---UNIX域套接字机制,并说明它的应用方法 UNIX域套接字 UNIX域套接字用于在同一台计算机上运行的进程(无关进程)之间的(全双工)通信.相比于因特网套接字,UNIX域套接字效率更高. UNIX域套接字仅仅复制数据,不执行协议处理,不需要添加或删除网络报头,无需计算校验和,不要产生顺序号,无需发送确认报文. UNIX域套接字提供流和数据报两种接口,就像是套接字和管道的混合(双向的通信),使用socketpair函数创建一对无命名的.相互连接的UNIX域套接字 #in

《Linux高性能服务器编程》学习总结(六)——高级I/O函数

第六章      高级I/O函数 网络I/O一直是Linux网络编程中极其重要的一部分,除了前面讲到的send.recv等,socket编程接口还给出了很多高级了I/O函数,这些函数大致分为三类:用于创建文件描述符的函数.用于读写控制的函数和用于控制I/O行为和属性的函数. pipe函数是用来创建一个管道,管道是较为原始的进程间通信手段,分为无名管道和有名管道,而无名管道只能用于有亲缘关系的进程之间传递消息.pipe建立的管道是单工的,其参数是一个包含两个元素的整形数组fd[2],创建成功后fd

Java精品高级课,架构课,java8新特性,P2P金融项目,程序设计,功能设计,数据库设计,第三方支付,web安全,视频教程

36套精品Java架构师,高并发,高性能,高可用,分布式,集群,电商,缓存,性能调优,设计模式,项目实战,P2P金融项目,大型分布式电商实战视频教程 视频课程包含: 高级Java架构师包含:Spring boot.Spring  cloud.Dubbo.Elasticsearch,Redis.ActiveMQ.Nginx.Mycat.Spring.MongoDB.ZeroMQ.Git.Nosql.Jvm.Mecached.Netty.Nio.Mina.java8新特性,P2P金融项目,程序设计,