有关 select 的多个提供商限制
select 函数用于确定一组套接字中某一个或多个套接字的状态。 对于每个套接字,调用方可以请求有关读取、写入或错误状态的信息。 fd_set 结构指示一组套接字。
Windows 套接字 2 允许应用程序使用多个服务提供商,但 select 函数仅限于与单个服务提供商关联的一组套接字。 这绝不会限制应用程序通过多个提供商打开多个套接字。
可通过两种方法来确定跨越多个服务提供商的一组套接字的状态:
- 采用阻塞语义时,使用 WSAWaitForMultipleEvents 或 WSAEventSelect 函数。
- 采用非阻塞操作且应用程序已在使用 Windows 消息泵时,使用 WSAAsyncSelect 函数。
当应用程序需要在跨越多个提供商的一组套接字上使用阻塞语义时,建议使用 WSAWaitForMultipleEvents。 应用程序还可以使用 WSAEventSelect 函数,该函数允许 FD_XXX 网络事件(请参阅 WSAEventSelect)与事件对象关联,并从事件对象范例(在重叠 I/O 和事件对象中介绍)内进行处理。
WSAAsyncSelect 函数不限于单个提供商,因为它采用单个套接字描述符作为输入参数。 但请注意,WSAEventSelect 函数提供的性能和可伸缩性均优于 WSAAsyncSelect,因为随着使用的套接字总数增加,维护消息泵与 Winsock 事件消息的开销也会增加。