SPI 中的共享套接字

Windows 套接字中的进程之间的套接字共享实现如下。 源进程调用 WSPDuplicateSocket 以获取特殊的 WSAPROTOCOL_INFO 结构。 它使用一些进程间通信 (IPC) 机制将此结构的内容传递给目标进程。 然后,目标进程在调用 WSPSocket 时使用 WSAPROTOCOL_INFO 结构。 此函数返回的套接字描述符将是基础套接字的附加套接字描述符,因此会变为共享。

服务提供商负责在源进程上下文中执行所需的任何操作,并创建 一个WSAPROTOCOL_INFO 结构,该结构随后在目标进程的上下文中显示为 WSPSocket 的参数时将被识别。 WSAPROTOCOL_INFO 结构的 dwProviderReserved 成员可供服务提供商使用,可用于存储任何有用的上下文信息,包括重复的句柄。

此机制设计为适用于 Windows 的单线程版本和抢占式多线程版本。 但请注意,在不使用 WSPDuplicateSocket 函数的情况下,可以在给定进程中的线程之间共享套接字,因为套接字描述符在所有进程的线程中都有效。

描述符分配部分所述,分配新的套接字描述符时,IFS 提供程序必须调用 WPUModifyIFSHandle ,非 IFS 提供程序必须调用 WPUCreateSocketHandle

下表说明了在切换模式下建立和使用共享套接字的一种可能方案。

源进程 IPC 目标进程
1) WSPSocketWSPConnect
2) 请求目标进程标识符。 ==>
3) 接收进程标识符请求和响应。
4) 接收进程标识符。 <==
5) 调用 WSPDuplicateSocket 以获取特殊的 WSAPROTOCOL_INFO 结构。
6) 将 WSAPROTOCOL_INFO 结构发送到目标。
==> 7) 接收 WSAPROTOCOL_INFO 结构。
8) 调用 WSPSocket 来创建共享套接字描述符。
9) 使用共享套接字进行数据交换。
10) WSPClosesocket <==