[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
:
-
如果处理
连接
调用 (非阻止) ,则表示连接已成功。
-
可以发送数据。
exceptfds
: