【问题标题】:Is WSASend with IOCP ordered?是否订购了带有 IOCP 的 WSASend?
【发布时间】:2018-08-26 05:52:08
【问题描述】:

我想创建一个 IOCP 应用程序来接收 TCP 数据,一旦收到,我将不得不处理数据并部分写出字节。了解带有 IOCP 的 WSASend 可以完成这项工作。但我担心 WSASend 是否同步到队列和 GetQueuedCompletionStatus 是否同步?例如:-

void processing_from_other_thread(...) {
...
DWORD state = still_doing1;
WSASend( ..,..,.., &state, .. );

DWORD state = still_doing2;
WSASend( ..,..,.., &state, .. );

DWORD state = still_doing3;
WSASend( ..,..,.., &state, .. );

DWORD state = Done;
PostCompletionQueue(....);
}

从上面的上下文来看,GetQueuedCompletionStatus 会让它们有序吗?

GetQueuedCompletionStatus();
return still_doing1
GetQueuedCompletionStatus();
return still_doing2
GetQueuedCompletionStatus();
return still_doing3
GetQueuedCompletionStatus();
return Done
Continue

我只是想确保未来的设计是正确的,恐怕它们不是有序的,例如,return still_doing2在still_doing1之前完成。发送的数据可能会影响到客户端。

【问题讨论】:

  • '发送的数据可能会影响到客户端'好吧,TCP套接字流将确保每个套接字的数据将按照发送顺序传输到对等方,但IOCP不保证完成通知将按顺序处理(甚至由同一个处理程序线程)。
  • 在发送数据的情况下,完成通知顺序通常无关紧要。发送缓冲区/s 被释放、删除或重新池化,如果没有错误,那就是真的,所以任何订单或处理程序线程都会这样做:) 然而,接收完成通常需要更仔细的处理。
  • @Martin James 让我试着理解你的意思。如果仅在单线程环境中,我执行 WSASend1、WSASend2、WSASend3,当获取队列时,它可能会得到 3、1、2? 1、3、2?但是发送的数据肯定是1,2,3?
  • 使用 TCP 套接字,当然,否则流式传输协议将被彻底破坏。

标签: c iocp


【解决方案1】:

在 IOCP I/O 模型下,应用程序负责组织传入和传出数据。换句话说,进程将不同的 I/O 相关消息发布到 IOCP,但不能保证 IOCP 以该确切顺序发送和/或接收数据

这是异步 I/O 的关键部分。

【讨论】:

  • 这样说吧,我只为一个线程处理一个重叠的对象。会订购吗?
  • 答案是否定的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 2021-01-05
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多