进程间传递描述符三

在Windows上,通过WSADuplicateSocket函数可以实现进程间传递Socket。该过程涉及复制Socket的WSAPROTOCOL_INFO结构,并使用接收进程的进程ID。接收进程通过此信息调用WSASocket来复制Socket,两者共享状态信息。需要注意的是,复制的Socket不是新创建的,而是原Socket的复制品,必须在接收进程调用WSASocket时指定WSA_FLAG_OVERLAPPED标志。
摘要由CSDN通过智能技术生成

进程间传递描述符三

--Windows上发送接收套接字(Socket)


Windows平台上内核对象都是HANDLE,如果要在进程间传递内核对象,Windows提供了DuplicateHandle函数。复制的HANDLE和原HANDLE实际上指向的是内核中的同一个对象。
对于Socket而言,则需要使用WSADuplicateSocket来传递Socket,这个操作不像DuplicateHandle那么直观,先来看看函数原型:
int WSADuplicateSocket(
  SOCKET s, // 要复制的socket对象
  DWORD dwProcessId, // 接收进程的进程号
  LPWSAPROTOCOL_INFO lpProtocolInfo // 把Socket的信息复制到这里
);
了解这个函数后,就可以简单的步骤。
1 首先发送进程要知道接收进程是谁,这个得靠进程间通信了,比如一块共享内存。
2 确认接收进程后,接着发送进程调用WSADuplicateSocket取得一个WSAPROTOCOL_INFO结构,这个结构是复制Socket的关键,不过不必太关心这个结构里面都是什么东西。
3 发送进程拿到这个结构后,得把它交给接收进程,拿到WSAPROTOCOL_INFO后,接收进程就可以复制发送进程的Socket了,这个也可以通过共享内存传递。
4 接收进程调用WSASocket函数,传递这个接收到的WSAPROTOCOL_INFO结构就可以复制Socket了。
需要注意的是,复制的Socket并不是一个真正的新的socket,只是一个复制品,它和原Socket共享所有的状态信息。
如果原Socket是使用socket函数创建的,那么接收进程调用WSASocket时必须指明WSA_FLAG_OVERLAPPED标记。

MSDN上介绍的很详细,见下面的时序表格:

发送进程

IPC

接收进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值