描述符分配
虽然鼓励 Windows 套接字服务提供商将套接字实现为可安装文件系统 (IFS) 对象,但 Winsock 体系结构还适合套接字句柄不是 IFS 对象的服务提供商。 具有 IFS 句柄的提供程序通过 WSAPROTOCOL_INFO 结构中的XP1_IFS_HANDLES属性位表示此情况。 (注意:XP1_IFS_HANDLES属性位未包含在 API 规范的 2.0.8 版中,但此后已通过错误机制添加)。Winsock SPI 客户端可以利用其套接字描述符是 IFS 句柄的提供程序,方法是将这些描述符与标准 Windows I/O 设施配合使用,例如 ReadFile 和 WriteFile。
每当 IFS 提供程序创建新的套接字描述符时,提供程序必须在向 Windows Sockets SPI 客户端提供新句柄之前调用 WPUModifyIFSHandle。 此函数采用提供程序标识符和提供程序建议的 IFS 句柄作为输入,并返回修改后的句柄。 IFS 提供程序只能向其客户端提供修改后的句柄,来自客户端的所有请求将仅引用此修改的句柄。 只要涉及作系统,修改后的句柄就可以与建议的句柄不区分。 因此,在大多数情况下,服务提供商将只选择在其所有内部处理中使用修改后的句柄。 此修改函数的目的是允许 Ws2_32.dll 大大简化标识与给定套接字关联的服务提供商的过程。
不返回 IFS 句柄的提供程序必须通过 WPUCreateSocketHandle 调用从 Ws2_32.dll 获取有效的句柄。 nonIFS 提供程序只能向其客户端提供 Windows 套接字2.DLL提供的句柄,并且来自客户端的所有请求将仅引用这些句柄。 为方便服务提供商实现者,WPUCreateSocketHandle 中的提供程序提供的输入参数之一是 DWORD 上下文值。 Ws2_32.dll 将此上下文值与分配的套接字句柄相关联,并允许服务提供商随时通过 WPUQuerySocketHandleContext 调用检索上下文值。 此上下文值的典型用途是存储指向服务提供程序维护的数据结构的指针,用于存储套接字状态信息。