我想创建一个IOCP应用程序来接收TCP数据,一旦接收到,我将不得不处理数据并部分写出字节。了解带有IOCP的WSASend可以完成此工作。但是我担心WSAS是否会到达队列,并且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
我只想确保将来的设计正确,恐怕它们不规则,例如,在still_doing1之前返回still_doing2完成。发送的数据可能会影响到客户端。
答案 0 :(得分:2)
在IOCP I / O模型下,应用程序负责组织传入和传出的数据。换句话说,该过程向IOCP发布了与I / O相关的不同消息,但不能保证IOCP会以该确切顺序发送和/或接收数据。
这是异步I / O的关键部分。