понимание портов завершения ввода-вывода

У меня это неясно, я где-то читал, что GetQueuedCompletionStatus вернет результаты WSARecv и WSASend в том порядке, в котором они были созданы, поэтому вот мой вопрос:
Если инициализировать CreateIoCompletionPort с помощью NumberOfConcurrentThreads = 1, откройте соединение с одним клиентом. и сервер вызывает сначала WSARecv, затем WSASend, но клиент никогда ничего не отправляет. Будет ли на сервере GetQueuedCompletionStatus никогда не возвращать результат от WSASend, потому что сначала должен произойти результат от WSARecv?


person porente    schedule 30.06.2016    source источник
comment
в чем вообще вопрос и при чем тут IOCP? вам нужно вызывать WSASend только после завершения WSARecv? или как/какая логика?   -  person RbMm    schedule 30.06.2016
comment
Я где-то читал, что GetQueuedCompletionStatus возвращает результаты WSARecv и WSASend в том порядке, в котором они были созданы - нет. Результаты возвращаются в порядке завершения ввода-вывода.   -  person Harry Johnston    schedule 02.07.2016
comment
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что он основан на ложном предположении.   -  person Harry Johnston    schedule 02.07.2016


Ответы (1)


когда операция ввода-вывода завершена (с успехом или первоначально ожидающим возврата) в файле с привязанным IOCP - пакет поставлен в очередь на IOCP - и GetQueuedCompletionStatus получил этот пакет. поэтому, если вы начинаете 2 операции ввода-вывода - WSARecv и WSASend и WSASend конкурируют первыми - GetQueuedCompletionStatus сначала возвращает статус WSASend, даже если WSARecv не завершен. поэтому GetQueuedCompletionStatus сразу после завершения какой-либо операции ввода-вывода в файле с этим IOCP

person RbMm    schedule 30.06.2016