SPI 中的共享套接字
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 | <== |