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