PFN_WSK_RECEIVE_FROM_EVENT回调函数 (wsk.h)

WskReceiveFromEvent 事件回调函数通知 WSK 应用程序已在数据报套接字上收到了一个或多个数据报。

语法

PFN_WSK_RECEIVE_FROM_EVENT PfnWskReceiveFromEvent;

NTSTATUS PfnWskReceiveFromEvent(
  [in, optional] PVOID SocketContext,
  [in]           ULONG Flags,
  [in, optional] PWSK_DATAGRAM_INDICATION DataIndication
)
{...}

参数

[in, optional] SocketContext

指向已接收数据报的数据报套接字的套接字上下文的指针。 WSK 应用程序在调用 WskSocket 函数以创建数据报套接字时,提供了指向 WSK 子系统的此指针。

[in] Flags

一个 ULONG 值,该值包含以下标志的组合的按位 OR:

MSG_BCAST

数据报作为链接层广播接收,或者接收的是作为广播地址的目标传输地址。

MSG_MCAST

接收数据报的目标传输地址是多播地址。

WSK_FLAG_AT_DISPATCH_LEVEL

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

[in, optional] DataIndication

指向描述收到的数据报的 WSK_DATAGRAM_INDICATION 结构链接列表的指针。 如果此参数为 NULL,则套接字不再正常工作,WSK 应用程序必须调用 WskCloseSocket 函数以尽快关闭套接字。

返回值

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

返回代码 说明
STATUS_SUCCESS
WSK 应用程序接受了数据报,并从 的链接列表中检索了所有数据报 WSK_DATAGRAM_INDICATION 结构。 当套接字上收到新数据报时,WSK 子系统可以再次调用 WskReceiveFromEvent 事件回调函数。
STATUS_PENDING
WSK 应用程序接受数据报,但未从 的链接列表中检索所有数据报 WSK_DATAGRAM_INDICATION 结构。 WSK 应用程序会保留WSK_DATAGRAM_INDICATION结构的链接列表,直到检索完所有数据报。 WSK 应用程序检索所有数据报后,它会调用 WskRelease 函数,将WSK_DATAGRAM_INDICATION结构的链接列表释放回 WSK 子系统。 当套接字上收到新数据报时,WSK 子系统可以再次调用 WskReceiveFromEvent 事件回调函数。
STATUS_DATA_NOT_ACCEPTED
WSK 应用程序不接受数据报。 如果 WSK 应用程序返回此状态代码,则 WSK 子系统的响应方式将有所不同,具体取决于 WSK 应用程序启用 WskReceiveFromEvent 事件回调函数的方式。
  • 如果 WSK 应用程序使用 SO_WSK_EVENT_CALLBACK 套接字选项启用了 WskReceiveFromEvent 事件回调函数,则 WSK 子系统将具有基础传输缓冲区数据报(如果可能),或者如果协议另有要求。 WSK 子系统将禁用 WskReceiveFromEvent 事件回调函数,并且不会再次调用 WskReceiveFromEvent 事件回调函数,直到 WSK 应用程序使用 SO_WSK_EVENT_CALLBACK 套接字选项重新启用此事件回调函数。 WSK 应用程序重新启用 WskReceiveFromEvent 事件回调函数后,WSK 子系统将恢复调用 WskReceiveFromEvent 事件回调函数以及套接字上收到新数据报的时间。
  • 如果 WSK 应用程序使用 启用了 WskReceiveFromEvent 事件回调函数 WSK_SET_STATIC_EVENT_CALLBACKS 客户端控制操作,WSK 子系统不会禁用 WskReceiveFromEvent 事件回调函数。 当套接字上收到新的数据报时,WSK 子系统将继续调用 WskReceiveFromEvent 事件回调函数。

注解

仅当事件回调函数以前使用 SO_WSK_EVENT_CALLBACK 套接字选项启用事件回调函数时,WSK 子系统才会在数据报套接字上收到新的数据报时调用 WSK 应用程序的 WskReceiveFromEvent 事件回调函数。 有关启用套接字的事件回调函数的详细信息,请参阅 启用和禁用事件回调函数

如果 WSK 应用程序的 WskReceiveFromEvent 事件回调函数在数据报套接字上启用,并且应用程序对同一数据报套接字上的 WskReceiveFrom 函数也有挂起调用,则当数据报到达时,对 WskReceiveFrom 函数的挂起调用将优先于 WskReceiveFromEvent 事件回调函数。 仅当没有 IRP 排队等待 WskReceiveFrom 函数的调用时,WSK 子系统才调用应用程序的 WskReceiveFromEvent 事件回调函数。 但是,WSK 应用程序不应假定 WSK 子系统不会为对 WskReceiveFrom 函数具有挂起调用的数据报套接字调用 应用程序的 WskReceiveFromEvent 事件回调函数。 存在争用条件,WSK 子系统仍可以为套接字调用 WSK 应用程序的 WskReceiveFromEvent 事件回调函数。 WSK 应用程序确保 WSK 子系统不会在数据报套接字上调用应用程序的 WskReceiveFromEvent 事件回调函数的唯一方法是在套接字上禁用应用程序的 WskReceiveFromEvent 事件回调函数。

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

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

要求

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

另请参阅

WSK_CLIENT_DATAGRAM_DISPATCH

WSK_DATAGRAM_INDICATION

WskCloseSocket

WskControlSocket

WskReceiveFrom

WskRelease

WskSendTo

WskSocket