GetQueuedCompletionStatus子程序

用途

从指定的 I/O 完成端口对完成包进行出队。

语法

#include <iocp.h>
boolean_t GetQueuedCompletionStatus (CompletionPort, TransferCount, CompletionKey, Overlapped, Timeout)
HANDLE CompletionPort;
LPDWORD TransferCount, CompletionKey;
LPOVERLAPPED Overlapped; DWORD Timeout;

描述

GetQueuedCompletionStatus子例程尝试从CompletionPort参数重新排序完成数据包。 如果没有要出队的完成包,那么此子例程将等待预定时间量 (如 超时 参数所指示) ,以便完成包到达。

GetQueuedCompletionStatus子例程返回一个布尔值,表示完成数据包是否已被取消队列。

GetQueuedCompletionStatus子程序是 I/O 完成端口(IOCP)内核扩展的一部分。

注: 此子例程仅与套接字的文件描述符或与异步 I/O (AIO) 子系统配合使用的常规文件配合使用。 它不能与其他类型的文件描述符一起使用。

参数

描述
CompletionPort 指定此子例程将尝试访问的完成端口。
TransferCount 指定传输的字节数。 此参数由子例程根据完成包中接收到的值设置。
CompletionKey 指定与传输请求中使用的文件描述符相关联的完成键。 此参数由子例程根据完成包中接收到的值设置。
重叠 指定传输请求中使用的重叠结构。 此参数由子例程根据完成包中接收到的值设置。 对于常规文件,对于已完成的 AIO 请求,此参数包含指向 AIOCB 的指针。 如果应用程序对常规文件的套接字和 AIO 使用相同的完成端口,那么它必须使用唯一的 CompletionKey 值来区分套接字和常规文件,以便正确解释 交叠 参数。
超时 指定子例程等待完成包的时间量 (以毫秒为单位)。 如果此参数设置为 INFINITE ,那么子例程将永不超时。

返回值

成功完成后,GetQueuedCompletionStatus子例程会返回一个布尔值,表示成功。

如果GetQueuedCompletionStatus子程序不成功,子程序处理程序将执行以下功能:
  • 将值 0 返回 0 调用程序。
  • 将指示特定错误的错误代码移动到 错误号 全局变量中。 有关 错误号 变量的进一步说明,请参阅本文档的 "相关信息" 部分中的链接。

错误代码

如果发生以下任何错误,那么该子例程不成功:
描述
ETIMEDOUT 未到达要出队的完成包,并且已经过 超时 参数。
EINVAL CompletionPort 或其他参数的值无效。
再次 资源暂时不可用。 如果睡眠被信号中断,那么可能返回 EAGAIN
ENOTCONN 未连接套接字。 ENOTCONN 返回可能由于两个原因而发生。 一种情况是,如果发出请求,然后关闭 联邦 ,然后将请求返回到流程。 错误将为 ENOTCONN。 另一个问题是,如果在 联邦 仍处于打开状态时套接字断开连接,那么套接字断开 (断开连接) 后的请求将返回 ENOTCONN
EBADF CompletionPort 参数的值无效时,也可能返回此错误代码。

示例

下面的程序片段说明了如何使用GetQueuedCompletionStatus子例程来重新排列完成数据包。
int transfer_count, completion_key
LPOVERLAPPED overlapped;
c = GetQueuedCompletionStatus (34, &transfer_count, &completion_key, &overlapped, 1000);