WSAPoll 函数 (winsock2.h)

WSAPoll 函数确定一个或多个套接字的状态。

语法

int WSAAPI WSAPoll(
  [in, out] LPWSAPOLLFD fdArray,
  [in]      ULONG       fds,
  [in]      INT         timeout
);

参数

[in, out] fdArray

一个或多个 POLLFD 结构的数组,这些结构指定请求状态的套接字集。 数组必须至少包含一个具有有效套接字的结构。 返回后,此参数接收更新的套接字,并在每个套接字上设置与状态查询条件匹配的 revents 状态标志成员。

[in] fds

fdarrayWSAPOLLFD 结构的数目。 这不一定是请求其状态的套接字数。

[in] timeout

一个 值,该值根据以下值指定等待行为。

含义
大于零 等待的时间(以毫秒为单位)。
零个 立即返回。
小于零 无限期等待。

返回值

返回以下值之一。

返回值 说明
零个 在计时器过期之前,没有套接字处于查询状态。
大于零 fdarrayPOLLFD 结构的 revents 成员为非零的元素数。
SOCKET_ERROR 出现了错误。 调用 WSAGetLastError 函数以检索扩展错误代码。
 
扩展错误代码 含义
WSAENETDOWN
网络子系统失败。
WSAEFAULT
读取用户输入参数时发生异常。
WSAEINVAL
传递的参数无效。 如果在请求套接字状态时 fdarray 参数指向的 WSAPOLLFD 结构,则返回此错误。 如果 fdarray 参数指向的任何 WSAPOLLFD 结构的 fd 成员中指定的套接字均无效,则也会返回此错误。
WSAENOBUFS
函数无法分配足够的内存。

注解

WSAPoll 函数在 Windows Vista 及更高版本上定义。

WSAPOLLFD 结构。 应用程序在 WSAPOLLFD 结构的 events 成员中设置相应的标志,以指定为每个相应套接字请求的状态类型。 WSAPoll 函数返回 WSAPOLLFD 结构的 revents 成员中套接字的状态。

对于每个套接字,调用方可以请求有关读取或写入状态的信息。 始终返回错误条件,因此无需请求有关它们的信息。

fdarray 参数指向的 WSAPOLLFD 结构。 不满足这些条件且没有错误条件的所有套接字都将将相应的 revents 成员设置为 0。

请求该套接字的状态时,可以在 WSAPOLLFD 结构中为给定套接字设置以下标志的组合:

标志 描述
POLLPRI 可以在不阻塞的情况下读取优先级数据。 Microsoft Winsock 提供程序不支持此标志。
POLLRDBAND 优先级带 (带外) 数据可以不受阻止地读取。
POLLRDNORM 正常数据可以在不阻塞的情况下读取。
POLLWRNORM 正常数据可以在不阻塞的情况下写入。
 

POLLIN 标志定义为 POLLRDNORMPOLLRDBAND 标志值的组合。 POLLOUT 标志的定义与 POLLWRNORM 标志值相同。

WSAPOLLFD 结构只能包含 Winsock 提供程序支持的上述标志的组合。 任何其他值都被视为错误, WSAPoll 将返回 SOCKET_ERROR。 对 WSAGetLastError 函数的后续调用将检索 WSAEINVAL 的扩展错误代码。 如果在 Microsoft Winsock 提供程序的套接字上设置了 POLLPRI 标志, 则 WSAPoll 函数将失败。

fdarray 参数指向的 WSAPOLLFD 结构指示套接字状态时:

标志 描述
POLLERR 出现错误。
POLLHUP 面向流的连接已断开连接或中止。
POLLNVAL 使用了无效的套接字。
POLLPRI 可以在不阻塞的情况下读取优先级数据。 Microsoft Winsock 提供程序不返回此标志。
POLLRDBAND 优先级带 (带外) 数据可以不受阻止地读取。
POLLRDNORM 正常数据可以在不阻塞的情况下读取。
POLLWRNORM 正常数据可以在不阻塞的情况下写入。
 

关于 TCP 和 UDP 套接字:

  • WSAPOLLFD 结构与 POLLRDNORM 一样正常数据。
  • WSAPOLLFD 结构,保证后续 的 recv 操作在不阻塞的情况下完成。
  • POLLWRNORMWSAPOLLFD 结构。
  • 由 POLLRDNORM 提供的 WSAPOLLFD 结构。 后续对 accept 的调用保证不会阻塞地完成。
  • 由 POLLRDBAND 提供的 WSAPOLLFD 结构。
  • 当远程对等机关闭发送操作 (收到 TCP FIN) 时,WSAPOLLFD 结构。 后续 的 recv 函数请求将返回零个字节。
  • 远程对等机启动正常断开连接时的 WSAPOLLFD 结构。
  • 当远程对等方突然断开连接时返回 WSAPOLLFD 结构。
  • 关闭本地套接字时的 WSAPOLLFD 结构。

fdarray 中) (非套接字的元素数由 nfds 指示。 其 fd 成员设置为负值的 fdarray 成员将被忽略,并且返回时,其重泄将设置为 POLLNVAL。 此行为对于维护固定 fdarray 分配的应用程序很有用,并且不会压缩数组以删除未使用的条目或重新分配内存。 在调用 WSAPoll 之前,无需清除任何元素的 revent

timeout 参数指定函数在返回之前等待的时间。 正值包含返回前等待的毫秒数。 零值强制 WSAPoll 立即返回,负值指示 WSAPoll 应无限期等待。

注意 当发出阻止 Winsock 调用(如 WSAPoll )并将 超时 参数设置为负数时,Winsock 可能需要等待网络事件,然后调用才能完成。 在这种情况下,Winsock 执行可发出警报的等待, (在同一线程上计划的 APC) 异步过程调用可能会中断该等待。 在 APC 内发出另一个阻止 Winsock 调用,该调用中断了同一线程上正在进行的阻止 Winsock 调用将导致未定义的行为,并且 Winsock 客户端绝不能尝试。
 
注意从 Windows 10 版本 2004 开始,当 TCP 套接字无法连接时, (POLLHUP \|POLLERR \|指示 POLLWRNORM) 。
 

Windows 8.1Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 及更高版本的 Windows 应用商店应用支持此函数。

要求

要求
最低受支持的客户端 Windows 8.1、Windows Vista [桌面应用 |UWP 应用]
最低受支持的服务器 Windows Server 2008 [桌面应用 | UWP 应用]
目标平台 Windows
标头 winsock2.h (包括 Winsock2.h)
Library Ws2_32.lib
DLL Ws2_32.dll

另请参阅

WSAGetLastError

WSAPOLLFD