进程间SOCKET句柄传递-进程池应用

本文详细介绍了如何在不同进程间传递SOCKET句柄,结合进程池技术,实现高效的TCP通信。内容涵盖socket基础知识,结构体封装,描述符传递方法以及在工作进程中的应用。
摘要由CSDN通过智能技术生成

 

1。函数及结构介绍
开发通信程序,经常遇到服务程序的开发,常见使用进程池及线程池,下面介绍一对在进程池应用非常有用的函数,sendmsg/recvmsg,可以通过这组函数在进程中传递socket描述符。可以在主进程使用多路复用侦听socket事件,将读写事件句柄传递给工作进程进行处理。
在使用函数前先来看一看下面的结构
struct msghdr {
 void    *msg_name;       /* Socket name */
 int     msg_namelen;    /* Length of name */
 struct iovec *msg_iov;   /* Data blocks */
 __kernel_size_t msg_iovlen;    /* Number of blocks  */
 void    *msg_control;          /* Per protocol magic (eg BSD file descriptor passing) */  
 __kernel_size_t msg_controllen; /* Length of cmsg list */  
 unsigned msg_flags;
};
msg_name,msg_namelen指向地址指针,用于套接口未连接场合如UPD套接字,如果无需指明协议地址如TCP协议,msg_name通常为NULL;
msg_iov,msg_iovlen指定输入输出缓冲区数组及长度;
msg_control, msg_controllen指定可选辅助数据的位置及大小,也称为控制信息;
msg_flags 只有recvmsg使用msg_flags成员,recvmsg被调用时,flags参数被拷贝到msg_flags成员,sendmsg忽略此成员,因为它使用flags参数驱动发送处理过程;
在使用recvmsg/sendmsg传递socket描述符时,msg_control成员指向的缓冲区被填以一个cmsghdr的结构:
 
struct cmsghdr
{
  socklen_t cmsg_len;
  int cmsg_level;
  int cmsg_type;
  /*下面可加入传输入数据,此处可写入描述符*/
}
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值