LPFN_RIONOTIFY回调函数 (mswsock.h)

RIONotify 函数将 方法注册用于通知行为的 I/O 完成队列,以便与 Winsock 注册的 I/O 扩展一起使用。

语法

LPFN_RIONOTIFY LpfnRionotify;

INT LpfnRionotify(
  RIO_CQ CQ
)
{...}

参数

CQ

标识 I/O 完成队列的描述符。

返回值

如果未发生错误, RIONotify 函数将返回 ERROR_SUCCESS。 否则,函数失败,并返回特定的错误代码。

返回代码 说明
WSAEINVAL
向该函数传递了无效参数。
如果在 CQ 参数 (RIO_INVALID_CQ(例如) )中传递无效的完成队列,则返回此错误。 发生内部错误时,也可以返回此错误。
WSAEALREADY
试图对非阻止套接字进行操作,而对该套接的操作已在进行中。
如果以前的 RIONotify 请求尚未完成,则返回此错误。

注解

RIONotify 函数使用 Winsock 注册的 I/O 扩展注册了用于发送或接收网络数据的通知行为的方法。

RIONotify 函数是应用程序发现请求已完成并等待对 RIODequeueCompletion 函数的调用的机制。 RIONotify 函数设置在 I/O 完成队列不为空且包含结果完成时用于通知行为的方法。

完成队列的通知行为是在创建 RIO_CQ 时设置的。 创建RIO_CQ时,RIO_NOTIFICATION_COMPLETION 结构将传递给 RIOCreateCompletionQueue 函数。

对于使用 事件的完成队列,RIO_NOTIFICATION_COMPLETION 结构的 Type 成员设置为 RIO_EVENT_COMPLETIONEvent.EventHandle 成员应包含由 WSACreateEventCreateEvent 函数创建的事件的句柄。 若要接收 RIONotify 完成,应用程序应使用 WSAWaitForMultipleEvents 或类似的等待例程等待指定的事件句柄。 如果应用程序计划重置并重复使用事件,则应用程序可以通过将 Event.NotifyReset 成员设置为非零值来减少开销。 这会导致发生通知时 RIONotify 函数自动重置事件。 这可减少调用 WSAResetEvent 函数以在调用 RIONotify 函数之间重置事件的需求。

RIONotify 函数被调用已用事件完成且指定的完成队列尚未为空时,将同步或异步设置事件。 在这两种情况下,其他条目都不需要在设置事件之前进入完成队列。 在完成队列包含未设置 RIO_MSG_DONT_NOTIFY 标志的请求之前,对于 RIONotify 函数而言,完成队列被视为空,并且未设置事件。 仍可使用 RIODequeueCompletion 函数检索任何已完成的请求。 设置事件后,应用程序通常会调用 RIODequeueCompletion 函数来取消对已完成的发送和接收请求的排队。

对于使用 I/O 完成端口的完成队列,RIO_NOTIFICATION_COMPLETION结构的 Type 成员设置为 RIO_IOCP_COMPLETIONIocp.IocpHandle 成员应包含 CreateIoCompletionPort 函数创建的 I/O 完成端口的句柄。 若要接收 RIONotify 完成,应用程序应调用 GetQueuedCompletionStatusGetQueuedCompletionStatusEx 函数。 应用程序应为完成队列提供专用 的 OVERLAPPED 对象,并且它还可以使用 Iocp.CompletionKey 成员将完成队列上的 RIONotify 请求与其他 I/O 完成请求(包括其他完成队列的 RIONotify 完成)区分开来。

使用线程池的应用程序可以使用线程池等待对象通过其线程池获取 RIONotify 完成。 在这种情况下,对 SetThreadpoolWait 函数的调用应立即跟随对 RIONotify 的调用。 如果在 RIONotify 之前调用 SetThreadpoolWait 函数,并且应用程序依赖于 RIONotify 来清除事件对象,则可能会导致等待对象回调的虚假执行。

注意

必须在运行时通过调用 WSAIoctl 函数并指定SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER opcode 来获取指向 RIONotify 函数的函数指针。 传递给 WSAIoctl 函数的输入缓冲区必须包含 WSAID_MULTIPLE_RIO,这是一个全局唯一标识符 (GUID) 其值标识 Winsock 注册的 I/O 扩展函数。 成功后, WSAIoctl 函数返回的输出包含指向 RIO_EXTENSION_FUNCTION_TABLE 结构的指针,该结构包含指向 Winsock 注册的 I/O 扩展函数的指针。 SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER IOCTL 在 Ws2def.h 头文件中定义。 WSAID_MULTIPLE_RIO GUID 在 Mswsock.h 头文件中定义。

 

Windows Phone 8:Windows Phone 8 及更高版本上的 Windows Phone 应用商店应用支持此函数。

Windows 8.1Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 及更高版本的 Windows 应用商店应用支持此函数。

线程安全性

如果多个线程尝试使用 RIODequeueCompletion 函数访问同一RIO_CQ,则必须通过关键部分、超薄的读取器编写器锁或类似的互斥机制协调访问。 如果未共享完成队列,则不需要相互排除。

要求

要求
Header mswsock.h