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);