【问题标题】:understanding IO Completion Ports了解 IO 完成端口
【发布时间】:2016-06-30 06:27:21
【问题描述】:

我不清楚,我在某处读到 GetQueuedCompletionStatus 将按照创建顺序返回 WSARecvWSASend 结果,所以这是我的问题:
在服务器中如果使用NumberOfConcurrentThreads = 1 初始化CreateIoCompletionPort,然后打开与一个客户端的连接,服务器首先调用WSARecv,然后调用WSASend,但客户端从不发送任何内容。在服务器中,GetQueuedCompletionStatus 是否永远不会返回来自WSASend 的结果,因为来自WSARecv 的结果必须首先发生?

【问题讨论】:

  • 到底是什么问题以及这里的 IOCP 是如何相关的?仅在 WSARecv 完成后才需要调用 WSASend 吗?或如何/什么逻辑?
  • 我在某处读到 GetQueuedCompletionStatus 将按照 WSARecv 和 WSASend 结果的创建顺序返回它们 - 不。结果按 I/O 完成的顺序返回。
  • 我投票结束这个问题,因为它是基于一个错误的假设。

标签: sockets winapi io-completion-ports


【解决方案1】:

当 IO 操作完成(成功或最初返回待处理)时,对具有绑定 IOCP 的文件 - 数据包排队到 IOCP - 并且 GetQueuedCompletionStatus 得到了这个数据包。因此,如果您开始 2 个 io 操作 - WSARecv 和 WSASend 和 WSASend 首先竞争 - GetQueuedCompletionStatus 首先返回 WSASend 状态,即使 WSARecv 未完成。所以 GetQueuedCompletionStatus 只是在使用此 IOCP 完成某些 io 操作后完成

【讨论】:

    猜你喜欢
    • 2014-02-08
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2021-08-30
    • 2010-11-13
    • 2014-08-15
    • 2015-04-23
    • 2018-05-22
    相关资源
    最近更新 更多