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
名为 WskAcceptEvent 的 WSK 子系统在 IRQL = DISPATCH_LEVEL 处 事件回调函数。 如果未设置此标志,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 代码之一:
返回代码 | 描述 |
---|---|
|
WSK 应用程序接受传入连接。 |
|
WSK 应用程序拒绝了传入的连接。 如果返回此值,WSK 子系统将代表 WSK 应用程序关闭接受的套接字。 |
言论
仅当使用 SO_WSK_EVENT_CALLBACK 套接字选项启用事件回调函数时,WSK 子系统才会调用 WSK 应用程序的 WskAcceptEvent 事件回调函数。 有关启用套接字的事件回调函数的详细信息,请参阅 启用和禁用事件回调函数。
如果在侦听套接字上启用了 WSK 应用程序的 WskAcceptEvent 事件回调函数,并且应用程序对同一侦听套接字上的 WskAccept 函数具有挂起调用, 然后,当传入连接到达时,对 WskAccept 的挂起调用优先于 WskAcceptEvent 事件回调函数。 仅当没有从挂起调用到 WskAccept 函数的 IRP 时,WSK 子系统才会调用应用程序的 WskAcceptEvent 事件回调函数。 但是,WSK 应用程序不应假定 WSK 子系统不会调用应用程序的 WskAcceptEvent 事件回调函数,该套接字具有对 WskAccept 函数的挂起调用。 存在争用条件,其中 WSK 子系统仍可调用 WSK 应用程序的 WskAcceptEvent 套接字的事件回调函数。 WSK 应用程序确保 WSK 子系统不会为侦听套接字调用应用程序的 WskAcceptEvent 事件回调函数的唯一方法是禁用应用程序的 WskAcceptEvent 套接字事件回调函数。
当 WSK 子系统调用 WSK 应用程序的 WskAcceptEvent 事件回调函数时,默认禁用接受套接字上的所有事件回调函数。 如果 WSK 应用程序在侦听套接字上启用任何面向连接的套接字事件回调函数,则默认在侦听套接字上接受的所有面向连接的套接字上启用这些事件回调函数。 有关启用任何接受套接字的事件回调函数的详细信息,请参阅 启用和禁用事件回调函数。
SOCKADDR 结构,LocalAddress 和 RemoteAddress 参数所指向的结构仅在调用 WskAcceptEvent 事件回调函数期间有效。 如果 WSK 应用程序稍后需要这些传输地址,可以在从 WskAcceptEvent 事件回调函数返回之前将这些结构的内容复制到其自己的 SOCKADDR 结构,或者稍后可以在接受的套接字上调用 WskGetLocalAddress 和 WskGetRemoteAddress 函数。
WSK 子系统代表 WSK 应用程序为接受的连接分配套接字对象结构的内存(WSK_SOCKET)。 关闭套接字时,WSK 子系统会解除分配此内存。
WSK 子系统在 IRQL <= DISPATCH_LEVEL 调用 WSK 应用程序的 WskAcceptEvent 事件回调函数。
WSK 应用程序的 WskAcceptEvent 事件回调函数不得等待 WSK 完成或事件回调函数上下文中的其他 WSK 请求的完成。 回调可以启动其他 WSK 请求(假设它在DISPATCH_LEVEL花费的时间不太多),但即使在 IRQL = PASSIVE_LEVEL调用回调,它也不能等待完成。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 在 Windows Vista 和更高版本的 Windows作系统中可用。 |
目标平台 | 窗户 |
标头 | wsk.h (包括 Wsk.h) |
IRQL | <= DISPATCH_LEVEL |