首页 > 解决方案 > 是否订购了带有 IOCP 的 WSASend?

问题描述

我想创建一个 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之前完成。发送的数据可能会影响到客户端。

标签: ciocp

解决方案


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

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


推荐阅读