socketpair的使用
socketpair函数概要例如以下:
#include <sys/types.h>
#include <sys/socket.h>
int socketpair(int domain, int type, int protocol, int sv[2]);
sys/types.h文件须要用来定义一些C宏常量。sys/socket.h文件必须包括进来定义socketpair函数原型。
socketpair函数须要四个參数。他们是:
套接口的域
套接口类型
使用的协议
指向存储文件描写叙述符的指针
类型參数声明了我们希望创建哪种类型的套接口。socketpair函数的选择例如以下:
SOCK_STREAM
SOCK_DGRAM
对于socketpair函数,protocol參数必须提供为0。
參数sv[2]是接收代表两个套接口的整数数组。每个文件描写叙述符代表一个套接口,而且与还有一个并没有差别。
假设函数成功,将会返回0值。否则将会返回-1表明创建失败,而且errno来表明特定的错误号。
关于流程。socketpair()函数创建出两个进程,fork()之后这两个进程都会运行主程序中的代码,这个一定要注意!尤其是bind的时候,假设bind两次的话,那就会出错了。通常会在子进程里调用一个带死循环的函数,这样就好了。(这个情况的样例会在综合运用中解说)
一下给出个简单的样例。
// 建立socket对
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <stdio.h>
int main ()
{
int fd[2];
int r = socketpair( AF_UNIX, SOCK_STREAM, 0, fd );
if ( r < 0 ) {
perror( "socketpair()" );
exit( 1 );
}
if ( fork() ) {
/* Parent process: echo client */
int val = 0;
close( fd[1] );
while ( 1 ) {
sleep( 1 );
++val;
printf( "Sending data: %d/n", val );
write( fd[0], &val, sizeof(val) );
read( fd[0], &val, sizeof(val) );
printf( "Data received: %d/n", val );
}
}
else {
/* Child process: echo server */
int val;
close( fd[0] );
while ( 1 ) {
read( fd[1], &val, sizeof(val) );
++val;
write( fd[1], &val, sizeof(val) );
}
}
}
在给出一个用sendmsg来传递数据的样例
/*****************************************
*
* Listing 1.2
*
* Example performing I/O on s socket pair:
*
* ******************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
int main(int argc,char **argv)
{
int z; /* Status return code */
int s[2]; /* Pair of sockets */
struct msghdr msg;
struct iovec iov[1];
char send_buf[100] = "TEST";
struct msghdr msgr;
struct iovec iovr[1];
char recv_buf[100];
/*
* Create a pair of local sockets:
*/
z = socketpair(AF_LOCAL,SOCK_STREAM,0,s);
if(z == -1)
{
fprintf(stderr,
"%s:socketpair(AF_LOCAL,SOCK_STREAM,""0)/n",strerror(errno));
return 1; /* Failed */
}
/*
* Sendmsg s[1]:
*/
bzero(&msg, sizeof(msg));
msg.msg_name = NULL; /* attention this is a pointer to void* type */
msg.msg_namelen = 0;
iov[0].iov_base = send_buf;
iov[0].iov_len = sizeof(send_buf);
msg.msg_iov = iov;
msg.msg_iovlen = 1;
printf("sendmsg begin./n");
z = sendmsg( s[1], &msg, 0 );
if(z == -1 )
{
fprintf(stderr,"Sendmsg failed. errno : %s/n",strerror(errno));
return -1;
}
printf("Sendmsg Success!/n");
/*
* Read from socket s[0]:
*/
bzero(&msg, sizeof(msg));
msgr.msg_name = NULL; /* attention this is a pointer to void* type */
msgr.msg_namelen = 0;
iovr[0].iov_base = &recv_buf;
iovr[0].iov_len = sizeof(recv_buf);
msgr.msg_iov = iovr;
msgr.msg_iovlen = 1;
z = recvmsg( s[0], &msgr, 0);
if(z == -1 )
{
fprintf(stderr,"Recvmsg failed. errno : %s/n",strerror(errno));
return -1;
}
printf("Recvmsg Success!/n");
printf("recvmsg : %s/n", recv_buf);
/*
* Close the sockets:
*/
close(s[0]);
close(s[1]);
puts("Done");
return 0;
}
socketpair的使用的更多相关文章
- socketpair理解
转载:http://liulixiaoyao.blog.51cto.com/1361095/533469/ 今天跟人谈到socketpair的问题,晚上回来写了个程序验证下自己的猜测! 先说说我的理解 ...
- [转] IPC之管道、FIFO、socketpair
管道和FIFO作为最初的UNIX IPC形式,现在已用得较少.SocketPair可作为全双工版本的管道,较为常用,这里简单做个笔记 管道 * 只用于有亲缘关系的进程间通信 * 单向,即半双工 (双向 ...
- socketpair创建双向通信的管道(全双工通信)
Linux下socketpair介绍: socketpair创建了一对无名的套接字描述符(只能在AF_UNIX域中使用),描述符存储于一个二元数组,例如sv[2] .这对套接字可以进行双工通信,每一个 ...
- UNIX网络编程——UNIX域套接字编程和socketpair 函数
一.UNIX Domain Socket IPC socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络soc ...
- c/c++ linux 进程间通信系列3,使用socketpair,pipe
linux 进程间通信系列3,使用socketpair,pipe 1,使用socketpair,实现进程间通信,是双向的. 2,使用pipe,实现进程间通信 使用pipe关键点:fd[0]只能用于接收 ...
- 输入系统:进程间双向通信(socketpair+binder)
一.双向通信(socketpair) socketpair()函数用于创建一对无名的.相互连接的套接子,如果函数成功,则返回0,创建好的套接字分别是sv[0]和sv[1]:否则返回-1,错误码保存于e ...
- socketpair初识
#include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/typ ...
- Libevent学习之SocketPair实现
Libevent设计的精化之一在于把Timer事件.Signal事件和IO事件统一集成在一个Reactor中,以统一的方式去处理这三种不同的事件,更确切的说是把Timer事件和Signal事件融合到了 ...
- UNIX域套接字编程和socketpair 函数
一.UNIX Domain Socket IPC socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络soc ...
随机推荐
- MooseFS源代码分析(三)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...
- Rhythmbox中文乱码解决的方法
转自:http://hi.baidu.com/morgensonne/item/3470aef58747abde6325d2d9 今天在网络上找到了一个比較好的解决Rhythmbox中文乱码的问题的方 ...
- SICP 习题 (1.9) 解题总结
SICP 习题 1.9 开始针对“迭代计算过程”和“递归计算过程”,有关迭代计算过程和递归计算过程的内容在书中的1.2.1节有详细讨论,要完成习题1.9,必须完全吃透1.2.1节的内容,不然的话,即使 ...
- last与lastlog命令
lastlog 列出所有用户最后登录的时间和登录终端的地址,如果此用户从来没有登录,则显示:**Never logged in**last 列出用户所有的登录时间和登录终端的地址
- 面试前的准备---C#知识点回顾----02
经过昨天大量的简历投递,今天陆续收到面试邀约,明日准备大战一场,是死是活一试便知 1.数据库的范式 这算入门问题了吧,但凡是个数据库类的,都得问吧, 但我们在回答的时候开始背书啦 第一范式(1NF)无 ...
- Chrome开发者工具详解(1):Elements、Console、Sources面板
Chrome开发者工具面板 面板上包含了Elements面板.Console面板.Sources面板.Network面板. Timeline面板.Profiles面板.Application面板.Se ...
- textarea 的最大高度以及最小高度
<script type="text/javascript"> $(function(){ $("#textarea3").textareaAuto ...
- 基础命名空间:序列化_自定义序列化 System.Runtime.Serialization
( (From Msdn) 自定义序列化是控制类型的序列化和反序列化的过程,通过控制序列化,可以确保序列化兼容性.换而言之,在不中断类型核心功能的情况下,可在类型的不同版本之间序列化和反序列化. 重 ...
- UIScrollView 滑动试图
UIScrollView --->UIView //创建UIScrollView testScrollView=[[UIScrollView alloc]init]; testScrollVie ...
- struts2 的struts.xml配置详解
在应用struts框架进行开发时,必不可少的一步就是对struts.xml进行配置,对于该文件了解越多,我们开发起一应用程序定会更加顺手.下面我们看一下struts.xml的内容,每一项都有什么作用. ...