WSASend с IOCP заказан?

Я хотел бы создать приложение IOCP для получения данных TCP. После получения мне придется обрабатывать данные и частично записывать байты. Поймите, что WSASend с IOCP может сделать эту работу. Но меня беспокоит, будет ли 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

Я просто хочу убедиться, что будущий дизайн корректен, я боюсь, что они не упорядочены. Например, возвращение still_doing2 завершено до still_doing1. Отправленные данные могут повлиять на сторону клиента.

1 ответ

В соответствии с моделью ввода / вывода IOCP приложение отвечает за организацию входящих и исходящих данных. Другими словами, процесс отправляет различные сообщения, связанные с вводом / выводом, в IOCP, но не гарантируется, что IOCP отправляет и / или получает данные в этом точном порядке.

Это ключевая часть асинхронного ввода-вывода.

Другие вопросы по тегам