PFN_WSK_ACCEPT_EVENT回调函数 (wsk.h)

WskAcceptEvent 事件回调函数通知 WSK 应用程序已接受侦听套接字上的传入连接。

语法

PFN_WSK_ACCEPT_EVENT PfnWskAcceptEvent;

NTSTATUS PfnWskAcceptEvent(
  [in, optional] PVOID SocketContext,
  [in]           ULONG Flags,
  [in]           PSOCKADDR LocalAddress,
  [in]           PSOCKADDR RemoteAddress,
  [in, optional] PWSK_SOCKET AcceptSocket,
  [out]          PVOID *AcceptSocketContext,
  [out]          const WSK_CLIENT_CONNECTION_DISPATCH **AcceptSocketDispatch
)
{...}

参数

[in, optional] SocketContext

指向接受传入连接的侦听套接字的套接字上下文的指针。 WSK 应用程序在调用 WskSocket 函数以创建侦听套接字时提供了指向 WSK 子系统的指针。

[in] Flags

包含以下标志的 ULONG 值,或零:

WSK_FLAG_AT_DISPATCH_LEVEL

在 IRQL = DISPATCH_LEVEL 调用 WskAcceptEvent 事件回调函数的 WSK 子系统。 如果未设置此标志,则 WSK 子系统可能在任何 IRQL <= DISPATCH_LEVEL调用了 WskAcceptEvent 事件回调函数。

[in] LocalAddress

指向缓冲区的指针,该缓冲区包含传入连接到达的本地传输地址。 缓冲区包含与 WSK 应用程序在创建侦听套接字时指定的地址系列对应的特定 SOCKADDR 结构类型。

[in] RemoteAddress

指向缓冲区的指针,该缓冲区包含来自传入连接的远程传输地址。 缓冲区包含与 WSK 应用程序在创建侦听套接字时指定的地址系列对应的特定 SOCKADDR 结构类型。

[in, optional] AcceptSocket

指向 WSK_SOCKET 结构的指针,该结构是接受的套接字的套接字对象。 如果此指针为 NULL,则侦听套接字不再正常工作,并且 WSK 应用程序必须调用 WskCloseSocket 函数以尽快关闭侦听套接字。

[out] AcceptSocketContext

指向变量的指针,该变量接收指向接受的套接字的 WSK 应用程序提供的上下文的指针。 WSK 子系统将此指针传递给接受的套接字的事件回调函数。 上下文信息对 WSK 子系统是不透明的,必须存储在非分页内存中。 如果 WSK 应用程序不会在接受的套接字上启用任何事件回调函数,则应用程序应将 AcceptSocketContext 参数指向的变量设置为 NULL

[out] AcceptSocketDispatch

指向接收指向常量的指针的变量的指针 WSK_CLIENT_CONNECTION_DISPATCH 结构。 此结构是一个调度表,其中包含指向已接受套接字的事件回调函数的指针。 如果 WSK 应用程序不会为接受的套接字启用所有事件回调函数,则应用程序应将调度表中未启用的事件回调函数的指针设置为 NULL 。 如果 WSK 应用程序不会在接受的套接字上启用任何事件回调函数,则应将 AcceptSocketDispatch 参数指向的变量设置为 NULL

返回值

WSK 应用程序的 WskAcceptEvent 事件回调函数可以返回以下 NTSTATUS 代码之一:

返回代码 说明
STATUS_SUCCESS
WSK 应用程序已接受传入连接。
STATUS_REQUEST_NOT_ACCEPTED
WSK 应用程序拒绝了传入连接。 如果返回此值,WSK 子系统将代表 WSK 应用程序关闭接受的套接字。

注解

仅当先前使用 SO_WSK_EVENT_CALLBACK 套接字选项启用事件回调函数时,WSK 子系统才会在侦听套接字上接受传入连接时调用 WSK 应用程序的 WskAcceptEvent 事件回调函数。 有关启用套接字的事件回调函数的详细信息,请参阅 启用和禁用事件回调函数

如果在侦听套接字上启用了 WSK 应用程序的 WskAcceptEvent 事件回调函数,并且该应用程序对同一侦听套接字上的 WskAccept 函数有挂起调用,则当传入连接到达时,对 WskAccept 的 挂起调用优先于 WskAcceptEvent 事件回调函数。 仅当 WskAccept 函数的挂起调用没有 IRP 排队时,WSK 子系统才调用应用程序的 WskAcceptEvent 事件回调函数。 但是,WSK 应用程序不应假定 WSK 子系统不会为具有对 WskAccept 函数 的挂起调用的侦听套接字调用 应用程序的 WskAcceptEvent 事件回调函数。 存在争用条件,其中 WSK 子系统仍可以为套接字调用 WSK 应用程序的 WskAcceptEvent 事件回调函数。 WSK 应用程序确保 WSK 子系统不会为侦听套接字调用应用程序的 WskAcceptEvent 事件回调函数的唯一方法是在套接字上禁用应用程序的 WskAcceptEvent 事件回调函数。

当 WSK 子系统调用 WSK 应用程序的 WskAcceptEvent 事件回调函数时,默认禁用接受的套接字上的所有事件回调函数。 如果 WSK 应用程序在侦听套接字上启用任何面向连接的套接字事件回调函数,则默认情况下,将在该侦听套接字上接受的所有面向连接的套接字上启用这些事件回调函数。 有关启用任何接受套接字的事件回调函数的详细信息,请参阅 启用和禁用事件回调函数

LocalAddress 和 RemoteAddress 参数指向的 SOCKADDR 结构仅在调用 WskAcceptEvent 事件回调函数期间有效。 如果 WSK 应用程序稍后需要这些传输地址,它可以在从 WskAcceptEvent 事件回调函数返回之前将这些结构的内容复制到其自己的 SOCKADDR 结构,或者以后可以在接受的套接字上调用 WskGetLocalAddressWskGetRemoteAddress 函数。

WSK 子系统代表 WSK 应用程序为接受的连接分配套接字对象结构的内存 ( WSK_SOCKET) 。 当套接字关闭时,WSK 子系统会解除分配此内存。

WSK 子系统在 IRQL <= DISPATCH_LEVEL调用 WSK 应用程序的 WskAcceptEvent 事件回调函数。

WSK 应用程序的 WskAcceptEvent 事件回调函数不得在 WSK 完成或事件回调函数的上下文中等待其他 WSK 请求完成。 回叫可以启动其他 WSK 请求 (假定它不会在DISPATCH_LEVEL) 花费太多时间,但即使回调在 IRQL = PASSIVE_LEVEL 调用,也不得等待其完成。

要求

要求
最低受支持的客户端 在 Windows Vista 和更高版本的 Windows 操作系统中可用。
目标平台 Windows
标头 wsk.h (包括 Wsk.h)
IRQL <= DISPATCH_LEVEL

另请参阅

SOCKADDR

WSK_CLIENT_CONNECTION_DISPATCH

WSK_CLIENT_LISTEN_DISPATCH

WSK_SOCKET

WskAccept

WskCloseSocket

WskControlSocket

WskGetLocalAddress

WskGetRemoteAddress

WskSocket