Понимание портов завершения ввода / вывода
У меня нет этого ясно, я где-то читал, что GetQueuedCompletionStatus
вернусь WSARecv
а также WSASend
результаты в том порядке, в котором они были созданы, поэтому вот мой вопрос:
На сервере Если инициализирован CreateIoCompletionPort
с NumberOfConcurrentThreads = 1
затем открыть соединение с одним клиентом, и сервер сначала вызывает WSARecv
затем WSASend
, но клиент никогда ничего не отправляет. На сервере будет GetQueuedCompletionStatus
никогда не возвращать результат от WSASend
потому что результат от WSARecv
должно произойти первым?
1 ответ
Когда операция ввода-вывода завершена (с успехом или первоначально ожидающим возврата) для файла с привязанным IOCP - пакет помещается в очередь на IOCP - и GetQueuedCompletionStatus получил этот пакет. поэтому, если вы начинаете 2 операции io - WSARecv, WSASend и WSASend соревнуются первыми - GetQueuedCompletionStatus сначала возвращаются со статусом WSASend, даже если WSARecv не завершен. поэтому GetQueuedCompletionStatus сразу после завершения какой-либо операции ввода-вывода для файла с этим IOCP