【问题标题】:What will be the values of these parameters when GetQueuedCompletionStatus() return FALSE?当 GetQueuedCompletionStatus() 返回 FALSE 时,这些参数的值是多少?
【发布时间】:2015-02-27 15:47:00
【问题描述】:

有两个原因会导致GetQueuedCompletionStatus()失败(返回FALSE),第一个是因为与其关联的完成端口句柄在调用未完成时关闭,如果lpOverlapped就会出现这种情况是NULL

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

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

我发现这对于lpNumberOfByteslpCompletionKeylpOverlapped 的值将是什么不是很清楚。这些参数是否包含我在调用WSARecv() 时提供的相同值?我想这更有可能是因为我想怎么知道是什么 IO 操作导致了失败!

【问题讨论】:

    标签: c++ sockets iocp


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-01-29
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-06
      • 2010-12-14
      相关资源
      最近更新 更多