Windows 套接字中的进程之间的套接字共享如下所示。 源进程调用 WSPDuplicateSocket 以获取特殊的 WSAPROTOCOL_INFO 结构。 它使用一些进程间通信(IPC)机制将此结构的内容传递给目标进程。 然后,目标进程在调用中使用 WSAPROTOCOL_INFO 结构来 WSPSocket。 此函数返回的套接字描述符将是基础套接字的额外套接字描述符,因此会共享。
服务提供商负责在源进程上下文中执行所需的任何作,并创建一个 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 | <== |