LPWSPSELECT 回调函数 (ws2spi.h)
LPWSPSelect 函数确定一个或多个套接字的状态。
语法
LPWSPSELECT Lpwspselect;
int Lpwspselect(
[in] int nfds,
[in, out] fd_set *readfds,
[in, out] fd_set *writefds,
[in, out] fd_set *exceptfds,
[in] const timeval *timeout,
[out] LPINT lpErrno
)
{...}
参数
[in] nfds
仅为了兼容性而忽略并包含这些内容。
[in, out] readfds
可选指针,指向要检查的套接字集的可读性。
[in, out] writefds
指向要检查可写性的一组套接字的可选指针。
[in, out] exceptfds
指向要检查错误的一组套接字的可选指针。
[in] timeout
LPWSP 选择等待的最长时间,对于阻塞操作为 null,采用时间值结构的形式。
[out] lpErrno
指向错误代码的指针。
返回值
LPWSPSelect 函数返回fd_set结构中已就绪且包含的描述符总数,如果发生错误,则SOCKET_ERROR。 如果返回值SOCKET_ERROR,则 lpErrno 中提供了特定的错误代码。
错误代码 | 含义 |
---|---|
Windows 套接字服务提供程序无法为其内部操作分配所需的资源,或者 readfds、 writefds、 exceptfds 或 timeval 参数不是用户地址空间的一部分。 | |
网络子系统失败。 | |
超时值无效,或者三个描述符参数全部为 NULL。 | |
(阻止) 调用已通过 LPWSPCancelBlockingCall 取消。 | |
正在阻止 Windows 套接字调用,或者服务提供程序仍在处理回调函数。 | |
其中一个描述符集包含不是套接字的条目。 |
注解
此函数用于确定一个或多个套接字的状态。 对于每个套接字,调用方可以请求有关读取、写入或错误状态的信息。 请求给定状态的套接字集由 fd_set 结构指示。 fd_set中的所有条目都对应于服务提供商创建的套接字 (即,描述其协议的WSAPROTOCOL_INFO结构) 具有相同的 providerId 值。 返回后,将更新结构以反映满足指定条件的这些套接字的子集, LPWSPSelect 返回满足条件的套接字总数。 提供了一组用于操作 fd_set的宏。 这些宏与伯克利软件中使用的宏兼容,但基础表示形式完全不同。
参数 readfds 标识要检查的可读性套接字。 如果套接字当前正在通过 LPWSPListen 侦听,如果已收到传入的连接请求,它将标记为可读,以便保证 LPWSPAccept 在不阻塞的情况下完成。 对于其他套接字,可读性意味着排队的数据可用于读取,以便保证 LPWSPRecv 或 LPWSPRecvFrom 不会阻止。
对于面向连接的套接字,可读性还可以指示已从对等方收到关闭请求。 如果虚拟线路正常关闭,则 LPWSPRecv 将立即返回并读取零个字节。 如果重置了虚拟线路,则 LPWSPRecv 将立即完成并显示错误代码,例如 WSAECONNRESET。 如果已启用套接字选项SO_OOBINLINE,将检查 OOB 数据是否存在 (请参阅 LPWSPSetSockOpt) 。
参数 writefds 标识要检查的可写性套接字:
- 如果套接字通过 LPWSPConnect 进行连接,可写性意味着连接建立已成功完成。
- 如果套接字未在通过 LPWSPConnect 侦听的过程中,可写性意味着 保证 LPWSPSend 或 LPWSPSendTo 成功。
但是,如果 len 超过可用的传出系统缓冲区空间量,则它们可以在阻止套接字上阻塞。 未指定可以假定这些保证有效多长时间,尤其是在多线程环境中。
参数 exceptfds 标识要检查的套接字是否存在 OOB 数据或任何异常错误条件。 请注意,仅当SO_OOBINLINE选项为 FALSE 时,才会以这种方式报告 OOB 数据。 如果套接字进行 LPWSPConnect (非阻止) 连接,则连接尝试失败在 exceptfds 中指示。 此规范不定义将包含哪些其他错误。
如果没有要检查相关条件的描述符,则任意两个 readfds、writefd 或 exceptfds 都可以被指定为 null。 必须至少有一个为非 null,并且任何非 null 描述符集必须至少包含一个套接字描述符。
摘要:当 LPWSPSelect 根据以下内容返回时,将在特定集中标识套接字。
参数 | 说明 |
---|---|
readfds: | 如果调用 LPWSPListen ,则连接挂起, LPWSPAccept 将成功。如果) 启用SO_OOBINLINE,则数据可用于读取 (包括 OOB 数据。连接已关闭/重置/终止。 |
writefds: | 如果 LPWSPConnect (非阻止) ,则表示连接已成功。可以发送数据。 |
exceptfds: | 如果 LPWSPConnect (非阻止) ,则连接尝试失败。仅当) 禁用SO_OOBINLINE时,OOB 数据才可用于读取 (。 |
头文件 Ws2spi.h 中定义了三个宏和一个结果函数,用于操作和检查描述符集。 变量FD_SETSIZE确定集中描述符的最大数目。 (FD_SETSIZE 的默认值为 64,在 #defining FD_SETSIZE #including Ws2spi.h.) 内部, fd_set 中的套接字句柄不如 Berkeley UNIX 中的位标志表示为位标志, 其数据表示是不透明的。 使用这些宏将保持不同套接字环境之间的软件可移植性。
用于操作和检查fd_set内容的宏包括:
-
FD_CLR (s,*set)
-
从设置中删除描述符 。
-
FD_SET (,*set)
-
添加要设置的描述符。
-
FD_ZERO (*set)
-
将 集 初始化为 null 集。
用于检查成员身份的httpall函数为:
-
intWPUFDIsSet (SOCKETs, FD_SET FAR *set) ;
-
如果 是集的成员,则返回非零值,否则返回零。
参数 超时 控制 LPWSPSelect 完成所需的时间。 如果 timeout 为 null 指针, 则 LPWSPSelect 将无限期阻止,直到至少有一个描述符满足指定条件。 否则,超时将指向指定 LPWSPSelect 在返回之前应等待的最长时间的时间值结构。 当 LPWSPSelect 返回时,不会更改时间值结构的内容。 如果 timeval 初始化为 {0, 0}, LPWSPSelect 将立即返回;用于轮询所选套接字的状态。 如果是这种情况,则 LPWSPSelect 调用被视为非阻止调用,并且非阻止调用的标准假设适用。 例如,不会调用阻塞挂钩,并且 Windows 套接字提供程序将不会生成。
注意
LPWSPSelect 函数对注册到 LPWSPAsyncSelect 或 LPWSPEventSelect 的套接字事件的持久性没有影响。
要求
最低受支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
最低受支持的服务器 | Windows 2000 Server [仅限桌面应用] |
标头 | ws2spi.h |
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈