如何映射 POSIX 的 select 和 Windows WSAEventSelect 的事件

How to map events of POSIX's select and Windows WSAEventSelect

POSIX 的 select 允许确定 3 个事件:

Window 的 WSAEventSelect 有 10:

如何将那些 Windows 事件映射到 POSIX 事件?

编辑

不幸的是,由于 multiple providers restriction.

,我无法使用 Windows 的 select 实现

如果您阅读文档,select()WSAEventSelect() 之间的映射并不难理解。

select function

WSAEventSelect function

select() 报告套接字在以下情况下可读:

  1. 套接字正在侦听并且有一个待处理的入站连接等待被接受 (FD_ACCEPT)
  2. 套接字有等待读取的挂起数据 (FD_READ)。如果在套接字上启用了 SO_OOBINLINE 选项,则这包括 Out-Of-Band 数据。
  3. 套接字已被对端正常关闭(FD_CLOSE,它也处理一些不正常的关闭)。

select() 报告套接字在以下情况下可写:

  1. a non-blocking connect() 已成功连接到侦听端口(FD_CONNECT,错误代码为零)
  2. 套接字有缓冲区space接受出站数据(FD_WRITE),在被接受后,或在前一个non-blocking发送后将不再阻塞。

select() 在以下情况下报告套接字异常:

  1. a non-blocking connect() 失败(FD_CONNECT,错误代码为 non-zero)。您可以使用 getsockopt(SOL_SOCKET, SO_ERROR) 获取错误代码。
  2. 如果在套接字 (FD_OOB) 上禁用 SO_OOBINLINE 选项,则套接字有待读取的 Out-Of-Band 数据等待读取。
  3. 出现各种套接字错误。

其余 WSA 事件没有 select() 等价物,因为它们严格地 WinSock-specific 与 POSIX/BSD 套接字 API 无关的扩展。

因此,您可以使用 WSAEventSelect() 设置所需的 FD_... 事件,然后使用 WSAWaitForMultipleEvents(). When an event is signaled, use WSAEnumNetworkEvents() 等待事件以获取关联的错误代码并清除事件的事件状态下次等等。