如何映射 POSIX 的 select 和 Windows WSAEventSelect 的事件
How to map events of POSIX's select and Windows WSAEventSelect
POSIX 的 select 允许确定 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 事件?
编辑
不幸的是,由于 multiple providers restriction.
,我无法使用 Windows 的 select
实现
如果您阅读文档,select()
和 WSAEventSelect()
之间的映射并不难理解。
select()
报告套接字在以下情况下可读:
- 套接字正在侦听并且有一个待处理的入站连接等待被接受 (
FD_ACCEPT
)
- 套接字有等待读取的挂起数据 (
FD_READ
)。如果在套接字上启用了 SO_OOBINLINE
选项,则这包括 Out-Of-Band 数据。
- 套接字已被对端正常关闭(
FD_CLOSE
,它也处理一些不正常的关闭)。
select()
报告套接字在以下情况下可写:
- a non-blocking
connect()
已成功连接到侦听端口(FD_CONNECT
,错误代码为零)
- 套接字有缓冲区space接受出站数据(
FD_WRITE
),在被接受后,或在前一个non-blocking发送后将不再阻塞。
select()
在以下情况下报告套接字异常:
- a non-blocking
connect()
失败(FD_CONNECT
,错误代码为 non-zero)。您可以使用 getsockopt(SOL_SOCKET, SO_ERROR)
获取错误代码。
- 如果在套接字 (
FD_OOB
) 上禁用 SO_OOBINLINE
选项,则套接字有待读取的 Out-Of-Band 数据等待读取。
- 出现各种套接字错误。
其余 WSA 事件没有 select()
等价物,因为它们严格地 WinSock-specific 与 POSIX/BSD 套接字 API 无关的扩展。
因此,您可以使用 WSAEventSelect()
设置所需的 FD_...
事件,然后使用 WSAWaitForMultipleEvents()
. When an event is signaled, use WSAEnumNetworkEvents()
等待事件以获取关联的错误代码并清除事件的事件状态下次等等。
POSIX 的 select 允许确定 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 事件?
编辑
不幸的是,由于 multiple providers restriction.
,我无法使用 Windows 的select
实现
如果您阅读文档,select()
和 WSAEventSelect()
之间的映射并不难理解。
select()
报告套接字在以下情况下可读:
- 套接字正在侦听并且有一个待处理的入站连接等待被接受 (
FD_ACCEPT
) - 套接字有等待读取的挂起数据 (
FD_READ
)。如果在套接字上启用了SO_OOBINLINE
选项,则这包括 Out-Of-Band 数据。 - 套接字已被对端正常关闭(
FD_CLOSE
,它也处理一些不正常的关闭)。
select()
报告套接字在以下情况下可写:
- a non-blocking
connect()
已成功连接到侦听端口(FD_CONNECT
,错误代码为零) - 套接字有缓冲区space接受出站数据(
FD_WRITE
),在被接受后,或在前一个non-blocking发送后将不再阻塞。
select()
在以下情况下报告套接字异常:
- a non-blocking
connect()
失败(FD_CONNECT
,错误代码为 non-zero)。您可以使用getsockopt(SOL_SOCKET, SO_ERROR)
获取错误代码。 - 如果在套接字 (
FD_OOB
) 上禁用SO_OOBINLINE
选项,则套接字有待读取的 Out-Of-Band 数据等待读取。 - 出现各种套接字错误。
其余 WSA 事件没有 select()
等价物,因为它们严格地 WinSock-specific 与 POSIX/BSD 套接字 API 无关的扩展。
因此,您可以使用 WSAEventSelect()
设置所需的 FD_...
事件,然后使用 WSAWaitForMultipleEvents()
. When an event is signaled, use WSAEnumNetworkEvents()
等待事件以获取关联的错误代码并清除事件的事件状态下次等等。