进程间传递描述符三
--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 |
接收进程 |