PFN_WSK_RECEIVE_FROM回调函数 (wsk.h)
WskReceiveFrom 函数从远程传输地址接收数据报和任何关联的控制信息。
语法
PFN_WSK_RECEIVE_FROM PfnWskReceiveFrom;
NTSTATUS PfnWskReceiveFrom(
[in] PWSK_SOCKET Socket,
[in] PWSK_BUF Buffer,
ULONG Flags,
[out, optional] PSOCKADDR RemoteAddress,
[in, out] PULONG ControlLength,
[out, optional] PCMSGHDR ControlInfo,
[out, optional] PULONG ControlFlags,
[in, out] PIRP Irp
)
{...}
参数
[in] Socket
指向 WSK_SOCKET 结构的指针,该结构指定要从中接收数据报的数据报套接字的套接字对象。
[in] Buffer
指向初始化 WSK_BUF 结构的指针,该结构描述从套接字接收数据报的数据缓冲区。
Flags
此参数保留供系统使用。 WSK 应用程序必须将此参数设置为零。
[out, optional] RemoteAddress
指向调用方分配的缓冲区的指针,该缓冲区接收接收的数据报从中发起的远程传输地址。 缓冲区必须位于非分页内存中。 缓冲区必须足够大,才能包含与 WSK 应用程序在创建数据报套接字时指定的地址系列对应的特定 SOCKADDR 结构类型。 此指针是可选的,可以 NULL。
[in, out] ControlLength
指向 ULONG 的指针,指定 ControlInfo 参数指向的缓冲区的大小。 当接收作完成时,变量将接收与接收的数据报关联的控件信息的大小。 如果返回的值为零,则数据报没有控件信息。 此指针是可选的,可以 NULL。 如果此参数 NULL,则忽略 ControlInfo 参数。
[out, optional] ControlInfo
指向调用方分配的缓冲区的指针,该缓冲区接收与接收的数据报关联的控制信息。 与数据报关联的控件信息数据由一个或多个控件数据对象组成,每个对象以 CMSGHDR 结构开头。 如果接收的数据报没有控件信息,则缓冲区的内容是未定义的。 此指针是可选的,可以 NULL。 如果 ControlInfoLength 参数 NULL,则 ControlInfo 参数应 NULL。
[out, optional] ControlFlags
指向 ULONG 类型的变量的指针,该变量接收以下标志的组合的按位 OR:
MSG_BCAST
数据报作为链接层广播接收,或者接收目标传输地址是广播地址。
MSG_MCAST
通过作为多播地址的目标传输地址接收数据报。
MSG_TRUNC
数据报被截断,因为数据报的大小大于 Buffer 参数指定的缓冲区的大小。
MSG_CTRUNC
控件信息数据被截断,因为控制信息的字节数大于由 ControlInfo 参数指定的缓冲区的大小。
此参数是可选的,可以 NULL。
[in, out] Irp
指向 WSK 子系统用于异步完成接收作的调用方分配的 IRP 的指针。 有关将 IRP 与 WSK 函数配合使用的详细信息,请参阅 将 IRP 与 Winsock 内核函数配合使用。
返回值
WskReceiveFrom 返回以下 NTSTATUS 代码之一:
返回代码 | 描述 |
---|---|
|
已成功从套接字接收数据。 IRP 将以成功状态完成。 IRP IoStatus.Information 字段包含收到的字节数。 |
|
WSK 子系统无法立即从套接字接收数据报。 WSK 子系统从套接字收到数据报后,将完成 IRP。 接收作的状态将在 IRP 的 IoStatus.Status 字段中返回。 如果作成功,则 IRP IoStatus.Information 字段将包含收到的字节数。 |
|
套接字不再正常工作。 IRP 将以失败状态完成。 WSK 应用程序必须调用 WskCloseSocket 函数才能尽快关闭套接字。 |
|
发生错误。 IRP 将以失败状态完成。 |
言论
如果 WSK 应用程序为数据报套接字设置了固定的远程传输地址,则 WSK 子系统将丢弃从任何其他远程传输地址接收的数据报。 有关设置数据报套接字的远程传输地址的详细信息,请参阅 SIO_WSK_SET_REMOTE_ADDRESS。
如果在数据报套接字上启用了 WskReceiveFromEvent WskReceiveFromEvent 事件回调函数,并且应用程序还对同一数据报套接字上的 WskReceiveFrom 函数进行挂起调用, 然后,当数据报到达时,对 WskReceiveFrom 函数的挂起调用将优先于 WskReceiveFromEvent 事件回调函数。 仅当没有从挂起调用到 WskReceiveFrom 函数的 IRP 时,WSK 子系统才会调用应用程序的 WskReceiveFromEvent 事件回调函数。 但是,WSK 应用程序不应假定 WSK 子系统不会调用应用程序的 WskReceiveFromEvent 事件回调函数,该套接字具有对 WskReceiveFrom 函数的挂起调用。 存在争用条件,其中 WSK 子系统仍可以调用 WSK 应用程序的 WskReceiveFromEvent 套接字的事件回调函数。 WSK 应用程序确保 WSK 子系统不会在数据报套接字上调用应用程序的 WskReceiveFromEvent 事件回调函数的唯一方法是禁用应用程序的 WskReceiveFromEvent 套接字上的事件回调函数。
如果 WskReceiveFrom 函数返回STATUS_PENDING,则在 IRP 完成之前,Buffer 参数指向的 WSK_BUF 结构中所述的 MDL 链必须保持锁定在内存中。 此外,ControlInfoLength 参数指向的变量、ControlInfo 参数指向的缓冲区,以及由 ControlFlags 参数指向的变量也必须保持有效状态,直到 IRP 完成。 如果 WSK 应用程序使用 ExAllocateXxx 函数之一分配了这些缓冲区或变量,则它无法释放具有相应 ExFreeXxx 函数的内存,直到 IRP 完成后。 如果 WSK 应用程序在堆栈上分配了这些缓冲区或变量,则它无法从调用 WskReceiveFrom 函数的函数返回,直到 IRP 完成后。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 在 Windows Vista 和更高版本的 Windows作系统中可用。 |
目标平台 | 普遍 |
标头 | wsk.h (包括 Wsk.h) |
IRQL | <= DISPATCH_LEVEL |