相关文章推荐
善良的小狗  ·  Python 操作 MySQL ...·  1 年前    · 
温暖的梨子  ·  『TypeScript』parseInt ...·  1 年前    · 
坚韧的丝瓜  ·  BluetoothAdapter.GetPr ...·  1 年前    · 
[in] int nfds, [in, out] fd_set *readfds, [in, out] fd_set *writefds, [in, out] fd_set *exceptfds, [in] const timeval *timeout

[in] nfds

已忽略。 包含 nfds 参数只是为了与 Berkeley 套接字兼容。

[in, out] readfds

一个可选指针,指向要检查的一组套接字的可读性。

[in, out] writefds

指向要检查可写性的一组套接字的可选指针。

[in, out] exceptfds

指向要检查错误的一组套接字的可选指针。

[in] timeout

选择 等待的最长时间,以 TIMEVAL 结构的形式提供。 将阻止操作的 超时 参数设置为 null

select 函数返回 fd_set 结构中已就绪并包含的套接字句柄总数;如果时间限制过期,则返回 0;如果发生错误,则返回SOCKET_ERROR。 如果返回值SOCKET_ERROR,则 WSAGetLastError 可用于检索特定的错误代码。

select 函数用于确定一个或多个套接字的状态。 对于每个套接字,调用方可以请求有关读取、写入或错误状态的信息。 请求给定状态的套接字集由 fd_set 结构指示。 包含在 fd_set 结构中的套接字必须与单个服务提供程序相关联。 出于此限制的目的,如果描述其协议 的WSAPROTOCOL_INFO 结构具有相同的 providerId 值,则将套接字视为来自同 一服务 提供程序。 返回后,将更新结构以反映满足指定条件的这些套接字的子集。 select 函数返回满足条件的套接字数。 提供了一组宏用于操作 fd_set 结构。 这些宏与伯克利软件中使用的宏兼容,但基础表示形式完全不同。

参数 readfds 标识要检查的可读性套接字。 如果套接字当前处于 侦听 状态,则如果已收到传入的连接请求,则它将标记为可读,以便保证 接受 在不阻塞的情况下完成。 对于其他套接字,可读性意味着排队的数据可用于读取,以便保证不阻止对 recv WSARecv 、WSARecvFrom recvfrom 的调用。

对于面向连接的套接字,可读性还可以指示已从对等方收到关闭套接字的请求。 如果虚拟线路正常关闭,并且接收了所有数据,则 recv 将立即返回且读取零个字节。 如果重置了虚拟线路,则 recv 将立即完成,错误代码为 WSAECONNRESET 。 如果已启用套接字选项SO_OOBINLINE,将检查 OOB 数据是否存在 (请参阅 setsockopt ) 。

参数 writefds 标识要检查的可写性套接字。 如果套接字正在处理 (非阻止) 的连接 调用,则如果连接建立成功完成,则套接字是可写的。 如果套接字未处理 连接 调用,可写性意味着 可以保证 send sendto WSASendto 成功。 但是,如果 len 参数超过可用的传出系统缓冲区空间量,则它们可以在阻止套接字上阻塞。 未指定可以假定这些保证有效多长时间,尤其是在多线程环境中。

参数 exceptfds 标识要检查的套接字是否存在 OOB 数据或任何异常错误条件。

注意 仅当选项SO_OOBINLINE为 FALSE 时,才会以这种方式报告带外数据。 如果套接字正在处理 (非阻止) 的连接 调用,则连接尝试失败的 指示 (应用程序 必须调用 getsockopt SO_ERROR来确定错误值,以描述) 失败的原因。 本文档不定义将包含哪些其他错误。
任何两个参数( readfds writefds exceptfds )都可以指定为 null 。 必须至少有一个非 null ,并且任何非 null 描述符集必须至少包含一个套接字的句柄。

总之,如果出现如下情况, 则 select 返回时,将在特定集中标识套接字:

readfds

  • 如果已调用 侦听 且连接挂起, 则接受 将成功。
  • 如果) 启用SO_OOBINLINE,则数据可用于读取 (包括 OOB 数据。
  • 连接已关闭/重置/终止。
  • writefds