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