LPFN_RIODEQUEUECOMPLETION回调函数 (mswsock.h)

RIODequeueCompletion 函数从 I/O 完成队列中删除条目,以便与 Winsock 注册的 I/O 扩展一起使用。

语法

LPFN_RIODEQUEUECOMPLETION LpfnRiodequeuecompletion;

ULONG LpfnRiodequeuecompletion(
  RIO_CQ CQ,
  PRIORESULT Array,
  ULONG ArraySize
)
{...}

参数

CQ

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

Array

一个 RIORESULT 结构的数组,用于接收取消排队的完成说明。

ArraySize

数组中要写入的最大条目数。

返回值

如果未发生错误, RIODequeueCompletion 函数将返回从指定完成队列中删除的完成项数。 否则,将返回值 RIO_CORRUPT_CQ,指示 CQ 参数中传递的RIO_CQ的状态由于内存损坏或滥用 RIO 函数而损坏。

注解

RIODequeueCompletion 函数从使用 Winsock 注册 I/O 扩展发送和接收请求的 I/O 完成队列中删除条目。

RIODequeueCompletion 函数是一种机制,应用程序可以通过该机制了解已完成的发送和接收请求。 当完成队列不为空时,应用程序通常会根据在 RIONotify 函数中注册的方法收到通知后调用 RIODequeueCompletion 函数。 I/O 完成队列的通知行为是在创建 RIO_CQ 时设置的。 创建RIO_CQ时,确定通知行为的RIO_NOTIFICATION_COMPLETION结构将传递给 RIOCreateCompletionQueue 函数。

RIODequeueCompletion 函数完成后,Array 参数包含指向已取消排队的已完成发送和接收请求的 RIORESULT 结构的指针数组。 返回的 RIORESULT 结构的成员提供有关已完成请求的完成状态和传输的字节数的信息。 每个返回的 RIORESULT 结构还包括一个套接字上下文和一个可用于标识特定已完成请求的应用程序上下文。

如果 CQ 参数中传递的 I/O 完成队列无效或已损坏, 则 RIODequeueCompletion 函数将返回 RIO_CORRUPT_CQ计数。

如果没有要取消排队的已完成的发送或接收请求, RIODequeueCompletion 函数返回值零。

只有在请求完成取消排队后,系统才会将关联释放到其缓冲区和缓冲区注册,以及其配额费用。

注意

为了提高效率,对完成队列的访问 (RIO_CQ 结构) 和请求队列 (RIO_RQ 结构) 不受同步基元的保护。 如果需要从多个线程访问完成队列或请求队列,应通过关键部分、超薄读取器写入锁或类似机制协调访问。 单个线程访问不需要此锁定。 不同的线程可以在没有锁的情况下访问单独的请求/完成队列。 仅当多个线程尝试访问同一队列时,才需要同步。 如果多个线程在同一套接字上发出发送和接收问题,则还需要同步,因为发送和接收操作使用套接字的请求队列。

 

注意

必须在运行时通过调用 WSAIoctl 函数并指定SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER操作码来获取指向 RIODequeueCompletion 函数的函数指针。 传递给 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