POSIX的选择允许确定3个事件:
- 读
- 写
- 错误
Window的WSAEventSelect有10个:
- FD_READ
- FD_WRITE
- FD_OOB
- FD_ACCEPT
- FD_CONNECT
- FD_CLOSE
- FD_QOS
- FD_GROUP_QOS
- FD_ROUTING_INTERFACE_CHANGE
- FD_ADDRESS_LIST_CHANGE
如何将这些 Windows 事件映射到 POSIX 事件?
编辑
不幸的是,由于多个提供程序的限制,我无法使用Windows的select
实现。
如果您阅读文档,select()
和 WSAEventSelect()
之间的映射并不难弄清楚。
选择功能
WSAEventSelect 函数
select()
报告套接字在以下情况下是可读的:
- 套接字正在侦听,并且有一个挂起的入站连接等待被接受 (
FD_ACCEPT
) - 套接字有等待读取的待处理数据 (
FD_READ
)。这包括带外数据(如果在套接字上启用了SO_OOBINLINE
选项)。 - 套接字已被对等方优雅地关闭(
FD_CLOSE
,它也处理一些不优雅的闭包)。
select()
报告套接字在以下情况下是可写的:
- 非阻塞
connect()
已成功连接到侦听端口(错误代码为零FD_CONNECT
) - 套接字有缓冲区空间来接受出站数据(
FD_WRITE
)后被接受,或者在以前的非阻塞发送将不再阻塞之后。
在以下情况下,select()
报告套接字上的异常:
- 非阻塞
connect()
失败(FD_CONNECT
错误代码为非零)。 您可以使用getsockopt(SOL_SOCKET, SO_ERROR)
获取错误代码。 - 如果套接字上禁用了
SO_OOBINLINE
选项(FD_OOB
),则套接字具有挂起的带外数据等待读取。 - 发生了各种套接字错误。
其余的WSA事件没有select()
等效项,因为它们是严格意义上的WinSock特定扩展,与POSIX/BSD套接字API无关。
因此,您将使用 WSAEventSelect()
来设置所需的FD_...
事件,然后使用 WSAWaitForMultipleEvents()
等待事件。 发出事件信号时,使用 WSAEnumNetworkEvents()
获取关联的错误代码并清除事件状态以供下次等待。