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



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()报告套接字在以下情况下是可读的:

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

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

  1. 非阻塞connect()已成功连接到侦听端口(错误代码为零FD_CONNECT
  2. 套接字有缓冲区空间来接受出站数据(FD_WRITE)后被接受,或者在以前的非阻塞发送将不再阻塞之后。

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

  1. 非阻塞connect()失败(FD_CONNECT错误代码为非零)。 您可以使用getsockopt(SOL_SOCKET, SO_ERROR)获取错误代码。
  2. 如果套接字上禁用了SO_OOBINLINE选项(FD_OOB),则套接字具有挂起的带外数据等待读取。
  3. 发生了各种套接字错误。

其余的WSA事件没有select()等效项,因为它们是严格意义上的WinSock特定扩展,与POSIX/BSD套接字API无关。

因此,您将使用 WSAEventSelect() 来设置所需的FD_...事件,然后使用 WSAWaitForMultipleEvents() 等待事件。 发出事件信号时,使用 WSAEnumNetworkEvents() 获取关联的错误代码并清除事件状态以供下次等待。

最新更新