PFN_WSK_ACCEPT回调函数 (wsk.h)
WskAccept 函数接受侦听套接字上的传入连接。
语法
PFN_WSK_ACCEPT PfnWskAccept;
NTSTATUS PfnWskAccept(
[in] PWSK_SOCKET ListenSocket,
ULONG Flags,
[in, optional] PVOID AcceptSocketContext,
[in, optional] const WSK_CLIENT_CONNECTION_DISPATCH *AcceptSocketDispatch,
[out, optional] PSOCKADDR LocalAddress,
[out, optional] PSOCKADDR RemoteAddress,
[in, out] PIRP Irp
)
{...}
参数
[in] ListenSocket
指向 WSK_SOCKET 结构的指针,该结构指定正在检查传入连接的侦听或流套接字的套接字对象。
Flags
此参数保留供系统使用。 WSK 应用程序必须将此参数设置为零。
[in, optional] AcceptSocketContext
指向所接受套接字的调用方提供的上下文的指针。 WSK 子系统将此指针传递给接受套接字的事件回调函数。 上下文信息对 WSK 子系统不透明。 上下文信息必须存储在非分页内存中。 如果 WSK 应用程序不会在接受的套接字上启用任何事件回调函数,则应将此指针设置为 NULL。
[in, optional] AcceptSocketDispatch
指向常量的指针 WSK_CLIENT_CONNECTION_DISPATCH 结构。 此结构是一个调度表,其中包含指向接受套接字的事件回调函数的指针。 如果 WSK 应用程序不会为接受的套接字启用所有事件回调函数,则应将调度表中的指针设置为为其未启用的那些事件回调函数 NULL。 如果 WSK 应用程序不会在接受的套接字上启用任何事件回调函数,则应将此指针设置为 NULL。
[out, optional] LocalAddress
指向调用方分配的缓冲区的指针,该缓冲区接收传入连接到达的本地传输地址。 缓冲区必须位于非分页内存中。 缓冲区必须足够大,才能包含与 WSK 应用程序在创建侦听套接字时指定的地址系列对应的特定 SOCKADDR 结构类型。 此指针是可选的,可以 NULL。
[out, optional] RemoteAddress
指向调用方分配的缓冲区的指针,该缓冲区接收来自传入连接的远程传输地址。 缓冲区必须位于非分页内存中。 缓冲区必须足够大,才能包含与 WSK 应用程序在创建侦听套接字时指定的地址系列对应的特定 SOCKADDR 结构类型。 此指针是可选的,可以 NULL。
[in, out] Irp
指向 WSK 子系统用于异步完成接受作的调用方分配的 IRP 的指针。 有关将 IRP 与 WSK 函数配合使用的详细信息,请参阅 将 IRP 与 Winsock 内核函数配合使用。
返回值
WskAccept 返回以下 NTSTATUS 代码之一:
返回代码 | 描述 |
---|---|
|
已成功接受传入连接。 IRP 将以成功状态完成。 |
|
IRP 已由 WSK 子系统排队,该子系统正在等待侦听套接字上的传入连接。 |
|
套接字不再正常工作。 IRP 将以失败状态完成。 WSK 应用程序必须调用 WskCloseSocket 函数才能尽快关闭套接字。 |
|
发生错误。 IRP 将以失败状态完成。 |
言论
WSK 应用程序可以通过调用 WskBind 函数,在以前绑定到本地传输地址的侦听套接字或流套接字上调用 WskAccept 函数。
WskAccept 函数的行为取决于传入的连接是否正在等待在侦听套接字上接受:
- 如果传入连接已到达侦听套接字并正在等待接受,则 WskAccept 函数返回STATUS_SUCCESS。 在这种情况下,IRP 以成功状态完成,IRP 的 IoStatus.Information 字段包含指向接受套接字的套接字对象的指针。
- 如果传入连接未等待在侦听套接字上接受,WskAccept 返回STATUS_PENDING,WSK 子系统在收到传入连接之前将 IRP 排入队列。 收到传入连接后,WSK 子系统以异步方式完成 IRP 并成功状态。 在这种情况下,IRP IoStatus.Information 字段包含指向接受套接字的套接字对象的指针。
当 WskAccept 函数成功接受传入连接时,默认禁用接受套接字上的所有事件回调函数。 有关启用任何接受套接字的事件回调函数的详细信息,请参阅 启用和禁用事件回调函数。
如果 WSK 应用程序在 LocalAddress 参数、RemoteAddress 参数或两个参数中指定非NULL 指针,并且如果 WskAccept 返回STATUS_PENDING,则这些参数指向的缓冲区必须一直有效,直到 IRP 完成。 如果 WSK 应用程序使用 ExAllocateXxx 函数之一分配了缓冲区,则在 IRP 完成后,它才能使用相应的 ExFreeXxx 函数释放内存。 如果 WSK 应用程序在堆栈上分配了缓冲区,则它无法从调用 WskAccept 函数的函数返回,直到 IRP 完成后。
WSK 子系统代表 WSK 应用程序为接受的连接分配套接字对象结构的内存(WSK_SOCKET)。 关闭套接字时,WSK 子系统会解除分配此内存。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 在 Windows Vista 和更高版本的 Windows作系统中可用。 |
目标平台 | 普遍 |
标头 | wsk.h (包括 Wsk.h) |
IRQL | <= DISPATCH_LEVEL |