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 中提供了特定的错误代码。

错误代码 含义
WSAEFAULT
Windows 套接字服务提供程序无法为其内部操作分配所需的资源,或者 readfdswritefdsexceptfdstimeval 参数不是用户地址空间的一部分。
WSAENETDOWN
网络子系统失败。
WSAEINVAL
超时值无效,或者三个描述符参数全部为 NULL
WSAEINTR
(阻止) 调用已通过 LPWSPCancelBlockingCall 取消。
WSAEINPROGRESS
正在阻止 Windows 套接字调用,或者服务提供程序仍在处理回调函数。
WSAENOTSOCK
其中一个描述符集包含不是套接字的条目。

注解

此函数用于确定一个或多个套接字的状态。 对于每个套接字,调用方可以请求有关读取、写入或错误状态的信息。 请求给定状态的套接字集由 fd_set 结构指示。 fd_set中的所有条目都对应于服务提供商创建的套接字 (即,描述其协议的WSAPROTOCOL_INFO结构) 具有相同的 providerId 值。 返回后,将更新结构以反映满足指定条件的这些套接字的子集, LPWSPSelect 返回满足条件的套接字总数。 提供了一组用于操作 fd_set的宏。 这些宏与伯克利软件中使用的宏兼容,但基础表示形式完全不同。

参数 readfds 标识要检查的可读性套接字。 如果套接字当前正在通过 LPWSPListen 侦听,如果已收到传入的连接请求,它将标记为可读,以便保证 LPWSPAccept 在不阻塞的情况下完成。 对于其他套接字,可读性意味着排队的数据可用于读取,以便保证 LPWSPRecvLPWSPRecvFrom 不会阻止。

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

参数 writefds 标识要检查的可写性套接字:

但是,如果 len 超过可用的传出系统缓冲区空间量,则它们可以在阻止套接字上阻塞。 未指定可以假定这些保证有效多长时间,尤其是在多线程环境中。

参数 exceptfds 标识要检查的套接字是否存在 OOB 数据或任何异常错误条件。 请注意,仅当SO_OOBINLINE选项为 FALSE 时,才会以这种方式报告 OOB 数据。 如果套接字进行 LPWSPConnect (非阻止) 连接,则连接尝试失败在 exceptfds 中指示。 此规范不定义将包含哪些其他错误。

如果没有要检查相关条件的描述符,则任意两个 readfds、writefdexceptfds 都可以被指定为 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 (SOCKETsFD_SET FAR *set) ;

如果 的成员,则返回非零值,否则返回零。

参数 超时 控制 LPWSPSelect 完成所需的时间。 如果 timeoutnull 指针, 则 LPWSPSelect 将无限期阻止,直到至少有一个描述符满足指定条件。 否则,超时将指向指定 LPWSPSelect 在返回之前应等待的最长时间的时间值结构。 当 LPWSPSelect 返回时,不会更改时间值结构的内容。 如果 timeval 初始化为 {0, 0}, LPWSPSelect 将立即返回;用于轮询所选套接字的状态。 如果是这种情况,则 LPWSPSelect 调用被视为非阻止调用,并且非阻止调用的标准假设适用。 例如,不会调用阻塞挂钩,并且 Windows 套接字提供程序将不会生成。

注意

LPWSPSelect 函数对注册到 LPWSPAsyncSelectLPWSPEventSelect 的套接字事件的持久性没有影响。

要求

   
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
标头 ws2spi.h

另请参阅

LPWSPAccept

LPWSPConnect

LPWSPEventSelect

LPWSPRecv

LPWSPRecvFrom

LPWSPSend

LPWSPSendTo