【问题标题】:Why GetQueuedCompletionStatus() does not return operation type?为什么 GetQueuedCompletionStatus() 不返回操作类型?
【发布时间】:2015-02-25 18:32:04
【问题描述】:

GetQueuedCompletionStatus()出列完成通知,但它不返回它是什么类型的通知(例如,读取通知,写入通知)。

我有责任跟踪我启动了哪些操作,例如,当我使用 WSARecv() 时,我在 OVERLAPPED 结构中添加一个标志,指示这是什么操作(在这种情况下读取),以及何时我出列通知,我读了这个标志。那么有谁知道GetQueuedCompletionStatus()为什么不返回操作的类型吗?

【问题讨论】:

  • 因为您应该自己跟踪。你拿回来的指针就是你的钥匙。从 OVERLAPPED 派生出自己的结构来存储任何额外的上下文是很常见的。
  • 实际操作与GQCS 无关。这取决于。它应该这样管理(作为每个 IO 状态的一部分,通常通过 OVERLAPPED 结构的扩展)。用于实际 IO 的 IOCP 编程(你也可以在没有 IO 的情况下使用它们)是一种状态机风格的编程,管理所说的状态。

标签: c++ sockets winapi network-programming overlapped-io


【解决方案1】:

它为什么要关心?您可以通过 API 传递用户数据,从而通过GetQueuedCompletionStatus() 提取完成,那么您为什么还需要其他任何东西呢?由于您可以使用PostQueuedCompletionStatus() 发布自己的完成,因此您可以完成无限数量的“操作”,因此将其传递到“扩展的OVERLAPPED 结构中,您可以传递任何内容...

如果您可以传递自己的单独标志,那么它实际上并不会消除将额外的额外内容作为扩展 OVERLAPPED 结构传递的需要,因为能够传递数据缓冲区和其他信息以及无论如何操作,所以一个额外的标志不太值得拥有......我的设计需要的比你的设计需要的多,所以让我们处理 API 设计者给我们的方法......

【讨论】:

    猜你喜欢
    • 2015-03-08
    • 1970-01-01
    • 2018-09-04
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2015-06-26
    相关资源
    最近更新 更多