当GetQueuedCompleteionStatus()返回FALSE时,这些参数的值是多少

What will be the values of these parameters when GetQueuedCompletionStatus() return FALSE?

本文关键字:参数 多少 GetQueuedCompleteionStatus 返回 FALSE      更新时间:2023-10-16

有两个原因会导致GetQueuedCompletionStatus()失败(返回FALSE),第一个原因是与之相关的完成端口句柄在调用未完成时关闭,如果lpOverlappedNULL,则会出现这种情况。

第二个原因(也是我关心的原因)是IO操作(例如:WSARecv())是否失败。这就是文件中对这种情况的描述:

如果*lpOverlapped不为NULL,并且函数将完成退出队列来自完成端口的失败I/O操作的数据包函数将有关失败操作的信息存储在lpNumberOfBytes、lpCompletionKey和所指向的变量lpOverlapped。若要获取扩展的错误信息,请调用GetLastError。

我不太清楚lpNumberOfByteslpCompletionKeylpOverlapped的值是什么。这些参数会包含与我调用WSARecv()时提供的值相同的值吗?我想这更有可能是因为我怎么知道是什么IO操作导致了故障!

如果I/O操作失败,则lpCompletionKeylpOverlapped将是您使用所使用的任何API(WSASend()WSARecv()等)启动I/O操作时提供的值。这就是您识别有问题的I/O操作的"每个设备"数据和"每个操作"数据的方法。

lpNumberOfBytes在错误情况下可能为零,尽管我倾向于像处理非错误情况一样处理它,因为我在错误处理过程中从不使用结果值(或缓冲区内容)。