2016-06-30 8 views
0

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

+0

в каком вопросе вообще и как здесь связаны IOCP? вам нужно вызвать WSASend только после завершения WSARecv? или как/что логика? – RbMm

+0

* Я где-то читал, что GetQueuedCompletionStatus вернет результаты WSARecv и WSASend в том порядке, в котором они были созданы * - no. Результаты возвращаются в порядке завершения ввода-вывода. –

+1

Я голосую, чтобы закрыть этот вопрос как вне темы, потому что он основан на ложном предположении. –

ответ

1

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