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

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

[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 将创建新的套接字。

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

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

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

参数 添加器 是一个结果参数,它用连接实体的地址填充,如服务提供商所称。 addr 参数的确切格式由发生通信的地址系列确定。 addrlen 是 value-result 参数;它最初将包含 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。 许多网络协议不支持连接时调用方数据。 大多数传统网络协议都可以在连接请求时支持调用方标识符信息。 lpCallerId 指向的 WSABUFbuf 部分指向 sockaddr根据 sockaddr 的地址系列 (解释 sockaddr 通常是通过将 sockaddr 强制转换为特定于地址系列) 的某种类型。

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

lpCalleeId 是一个值参数,其中包含已连接实体的本地地址。 lpCalleeId 指向的 WSABUFbuf 部分指向 sockaddr根据 sockaddr 的地址系列 (解释 sockaddr 通常是通过将 sockaddr 强制转换为特定于地址系列) 的某种类型。

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

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

要求

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

另请参阅

LPWSPAsyncSelect

LPWSPBind

LPWSPConnect

LPWSPEventSelect

LPWSPGetSockopt

LPWSPListen

LPWSPSelect

LPWSPSocket