当 GetQueuedCompletionStatus() 返回 FALSE 时,这些参数的值是多少?
Posted
技术标签:
【中文标题】当 GetQueuedCompletionStatus() 返回 FALSE 时,这些参数的值是多少?【英文标题】:What will be the values of these parameters when GetQueuedCompletionStatus() return FALSE? 【发布时间】:2015-02-27 15:47:00 【问题描述】:有两个原因会导致GetQueuedCompletionStatus()
失败(返回FALSE
),第一个是因为与其关联的完成端口句柄在调用未完成时关闭,如果lpOverlapped
就会出现这种情况是NULL
。
第二个原因(这是我关心的一个)是如果 IO 操作(例如:WSARecv()
)失败。这就是文档对这种情况的描述:
如果 *lpOverlapped 不为 NULL 并且函数将完成出列 来自完成端口的失败 I/O 操作的数据包, 函数将有关失败操作的信息存储在 lpNumberOfBytes、lpCompletionKey 和 lp重叠。要获取扩展的错误信息,请调用 GetLastError。
我发现这对于lpNumberOfBytes
、lpCompletionKey
和lpOverlapped
的值将是什么不是很清楚。这些参数是否包含我在调用WSARecv()
时提供的相同值?我想这更有可能是因为我想怎么知道是什么 IO 操作导致了失败!
【问题讨论】:
【参考方案1】:如果 I/O 操作失败,则 lpCompletionKey
和 lpOverlapped
将是您使用所使用的任何 API(WSASend()
、WSARecv()
等)启动 I/O 操作时提供的值.这就是您识别相关 I/O 操作的“每个设备”数据和“每个操作”数据的方式。
lpNumberOfBytes
在错误情况下可能为零,尽管我倾向于像处理非错误情况一样处理它,因为无论如何我在错误处理期间从不使用结果值(或缓冲区内容)。
【讨论】:
以上是关于当 GetQueuedCompletionStatus() 返回 FALSE 时,这些参数的值是多少?的主要内容,如果未能解决你的问题,请参考以下文章