SPI 中的共享套接字
Windows 套接字中的进程之间的套接字共享实现如下。 源进程调用 WSPDuplicateSocket 以获取特殊的 WSAPROTOCOL_INFO 结构。 它使用一些进程间通信 (IPC) 机制将此结构的内容传递给目标进程。 然后,目标进程在调用 WSPSocket 时使用 WSAPROTOCOL_INFO 结构。 此函数返回的套接字描述符将是基础套接字的附加套接字描述符,因此会变为共享。
服务提供商负责在源进程上下文中执行所需的任何操作,并创建 一个WSAPROTOCOL_INFO 结构,该结构随后在目标进程的上下文中显示为 WSPSocket 的参数时将被识别。 WSAPROTOCOL_INFO 结构的 dwProviderReserved 成员可供服务提供商使用,可用于存储任何有用的上下文信息,包括重复的句柄。
此机制设计为适用于 Windows 的单线程版本和抢占式多线程版本。 但请注意,在不使用 WSPDuplicateSocket 函数的情况下,可以在给定进程中的线程之间共享套接字,因为套接字描述符在所有进程的线程中都有效。
如 描述符分配部分所述,分配新的套接字描述符时,IFS 提供程序必须调用 WPUModifyIFSHandle ,非 IFS 提供程序必须调用 WPUCreateSocketHandle。
下表说明了在切换模式下建立和使用共享套接字的一种可能方案。
源进程 | IPC | 目标进程 |
---|---|---|
1) WSPSocket、 WSPConnect | ||
2) 请求目标进程标识符。 | ==> | |
3) 接收进程标识符请求和响应。 | ||
4) 接收进程标识符。 | <== | |
5) 调用 WSPDuplicateSocket 以获取特殊的 WSAPROTOCOL_INFO 结构。 | ||
6) 将 WSAPROTOCOL_INFO 结构发送到目标。 | ||
==> | 7) 接收 WSAPROTOCOL_INFO 结构。 | |
8) 调用 WSPSocket 来创建共享套接字描述符。 | ||
9) 使用共享套接字进行数据交换。 | ||
10) WSPClosesocket | <== |