LPWSPACCEPT 回调函数 (ws2spi.h)

LPWSPAccept 函数根据条件函数的返回值有条件地接受连接。

语法

LPWSPACCEPT Lpwspaccept;

SOCKET Lpwspaccept(
  [in]      SOCKET s,
  [out]     sockaddr *addr,
  [in, out] LPINT addrlen,
  [in]      LPCONDITIONPROC lpfnCondition,
  [in]      DWORD_PTR dwCallbackData,
  [out]     LPINT lpErrno
)
{...}

参数

[in] s

标识在 LPWSPListen后侦听连接的套接字的描述符。

[out] addr

指向接收连接实体地址(称为服务提供商)的缓冲区的可选指针。 addr 参数的确切格式由创建 sockaddr 结构中的套接字时建立的地址系列确定。

[in, out] addrlen

指向包含 addr 参数长度的整数的可选指针,以字节为单位。

[in] lpfnCondition

Windows 套接字提供的可选条件函数的过程实例地址。 根据作为参数传入的调用方信息,在接受或拒绝决策中使用此函数。

[in] dwCallbackData

要作为条件函数的 dwCallbackData 参数的值传递回 Windows Socket 2 客户端的回调数据。 服务提供商不解释此参数。

[out] lpErrno

指向错误代码的指针。

返回值

如果未发生错误,LPWSPAccept 将返回一个类型为 SOCKET 的值,该值是接受套接字的描述符。 否则,返回INVALID_SOCKET值,lpErrno中提供了特定的错误代码。

错误代码 意义
WSAECONNREFUSED
已强制拒绝连接请求,如条件函数(CF_REJECT)的返回值所示。
WSAECONNRESET
指示传入连接,但在接受呼叫之前,远程对等方随后终止。
WSAENETDOWN
网络子系统已失败。
WSAEFAULT
addrlen 参数太小,或者 lpfnCondition 参数不属于用户地址空间。
WSAEINTR
LPWSPCancelBlockingCall取消了(阻止)呼叫。
WSAEINPROGRESS
正在进行阻止的 Windows 套接字调用。
WSAEINVAL
在 LPWSPAccept 之前未调用 LPWSPListen,条件函数中指定的参数 g 不是有效值,条件函数的返回值不是有效的值,或者指定套接字处于无效状态的任何情况下。
WSAEMFILE
进入 LPWSPAccept 时,队列是无空的,没有可用的套接字描述符。
WSAENOBUFS
没有可用的缓冲区空间。
WSAENOTSOCK
描述符不是套接字。
WSAEOPNOTSUPP
引用的套接字不是支持面向连接的服务的类型。
WSATRY_AGAIN
已延迟接受连接请求,如条件函数的返回值(CF_DEFER所示)。
WSAEWOULDBLOCK
套接字被标记为非阻止,并且没有接受连接。
WSAEACCES
提供的连接请求已超时或已撤回。

言论

LPWSPAccept 函数提取套接字上挂起连接队列中的第一个连接 ,并在指定条件函数(即非 null)的情况下检查该连接。 条件函数必须在与此例程相同的线程中执行。 如果条件函数返回CF_ACCEPT,LPWSPAccept 创建新的套接字。

新创建的套接字的属性与套接字 相同,包括使用 LPWSPAsyncSelect 注册的网络事件,或 LPWSPEventSelect。 如 描述符Allocation中所述,分配新的套接字描述符时,IFS 提供程序必须调用 WPUModifyIFSHandle,非 IFS 提供程序必须调用 WPUCreateSocketHandle

如果条件函数返回CF_REJECT,LPWSPAccept 拒绝连接请求。 如果无法立即做出应用程序的接受/拒绝决策,条件函数将返回CF_DEFER以指示尚未做出任何决定。 服务提供商不会对此连接请求执行任何操作。 当应用程序准备好对连接请求执行操作时,它将再次调用 LPWSPAccept,并返回CF_ACCEPT或CF_REJECT作为条件函数的返回值。

对于处于(默认)阻塞模式的套接字,如果队列中不存在挂起的连接,LPWSPAccept 阻止调用方,直到存在连接。 对于非阻止模式下的套接字,如果在队列中不存在挂起的连接时调用此函数,LPWSPAccept 返回错误代码 WSAEWOULDBLOCK。 接受的套接字不能用于接受更多连接。 原始套接字保持打开状态。

参数 addr 是一个结果参数,它填充了连接实体的地址,称为服务提供商。 addr 参数的确切格式由通信所在的地址系列决定。 addrlen 是值结果参数;它最初将包含 addr指向的空间量。返回时,它必须包含服务提供商返回的地址的实际长度(以字节为单位)。 此调用用于面向连接的套接字类型,例如SOCK_STREAM。 如果 addr 和/或 addrlen 等于 null,则不会返回有关接受套接字的远程地址的信息。 否则,无论条件函数是指定还是返回什么,都应当填充这两个参数。

条件函数的原型如下所示。

int CALLBACK 
ConditionFunc( 
  IN     LPWSABUF    lpCallerId, 
  IN     LPWSABUF    lpCallerData, 
  IN OUT LPQOS       lpSQOS, 
  IN OUT LPQOS       lpGQOS,
  IN     LPWSABUF    lpCalleeId, 
  IN     LPWSABUF    lpCalleeData, 
  OUT    GROUP FAR * g, 	
  IN     DWORD_PTR   dwCallbackData
);

lpCallerIdlpCallerData 是值参数,这些参数必须包含连接实体的地址以及随连接请求一起发送的任何用户数据。 如果没有可用的调用方标识符或调用方数据,则相应的参数将为 null。 许多网络协议不支持连接时调用方数据。 大多数传统的网络协议可以在连接请求时支持调用方标识符信息。 lpCaller Id 指向的 WSABUFbuf 部分指向 sockaddrsockaddr 根据其地址系列进行解释(通常通过将 sockaddr 转换为特定于地址系列的某种类型)。

lpSQOS 参数引用调用方指定的套接字 流规范,每个方向各有一个,后跟任何其他提供程序特定的参数。 对于任何单向套接字,将忽略发送或接收流规范值。 lpSQOS 的 null 值表示没有调用方提供的 QoS,并且无法进行协商。 非NULLlpSQOS 指针指示将进行 QoS 协商,或者提供程序准备在没有协商的情况下接受 QoS 请求。

lpCalleeId 是包含已连接实体的本地地址的值参数。 WSABUF 所指向的 buf 部分 lpCalleeId 指向 sockaddrsockaddr 根据其地址系列进行解释(通常通过将 sockaddr 转换为特定于地址系列的某种类型)。

lpCalleeData 是条件函数用来将用户数据送回连接实体的结果参数。 此数据的存储必须由服务提供商提供。 lpCalleeData->len 最初包含服务提供商分配的缓冲区的长度,lpCalleeData指向>buf。 零值表示不支持将用户数据传回调用方。 条件函数将最多 lpCalleeData->len 字节的数据复制到 lpCalleeData->buf,然后更新 lpCalleeData->len,以指示传输的实际字节数。 如果未将用户数据传回调用方,条件函数将 lpCalleeData->len 设置为零。 所有地址和用户数据的格式都特定于套接字所属的地址系列。

传递给条件函数 dwCallbackData 参数值是在原始 LPWSPAccept 调用中作为 dwCallbackData 参数传递的值。 此值仅由 Windows 套接字 2 客户端解释。 这允许客户端将一些上下文信息从 LPWSPAccept 调用站点传递到条件函数,该函数为条件函数提供确定是否接受连接所需的任何其他信息。 典型的用法是将(适当强制转换)指针传递给包含对此套接字关联的应用程序定义对象的引用的数据结构。

要求

要求 价值
最低支持的客户端 Windows 2000 Professional [仅限桌面应用]
支持的最低服务器 Windows 2000 Server [仅限桌面应用]
目标平台 窗户
标头 ws2spi.h

另请参阅

LPWSPAsyncSelect

LPWSPBind

LPWSPConnect

LPWSPEventSelect

LPWSPGetSockOpt

LPWSPListen

LPWSPSelect

LPWSPSocket