Каковы будут значения этих параметров, когда GetQueuedCompletionStatus() вернет FALSE?
Есть две причины, которые могут вызвать GetQueuedCompletionStatus()
потерпеть неудачу FALSE
), во-первых, потому что дескриптор порта завершения, связанный с ним, закрыт, в то время как вызов является ожидающим, это будет иметь место, если lpOverlapped
является NULL
,
Вторая причина (о которой я забочусь) заключается в том, что операция ввода-вывода (например: WSARecv()
) не удается Вот что говорит документация об этой ситуации:
Если *lpOverlapped не равен NULL, и функция удаляет пакет завершения для неудачной операции ввода-вывода из порта завершения, функция сохраняет информацию о неудачной операции в переменных, на которые указывают lpNumberOfBytes, lpCompletionKey и lpOverlapped. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.
Я не считаю, что это очень ясно, каковы значения lpNumberOfBytes
, lpCompletionKey
, а также lpOverlapped
будет. Будут ли эти параметры содержать те же значения, которые я указал при вызове WSARecv()
? Я предполагаю, что это более вероятно, потому что, как еще я должен знать, какая операция ввода-вывода вызвала сбой!
1 ответ
Если операция ввода-вывода завершается неудачей, lpCompletionKey
а также lpOverlapped
будут значения, которые были предоставлены, когда вы инициировали операцию ввода-вывода с использованием любого API-интерфейса (WSASend()
, WSARecv()
, так далее.). Таким образом вы определяете данные "на устройство" и "на операцию" для рассматриваемой операции ввода / вывода.
lpNumberOfBytes
в ситуациях с ошибками, вероятно, будет равен нулю, хотя я склонен иметь дело с ним так же, как и с ошибками, поскольку я никогда не использую результирующее значение (или содержимое буфера) во время обработки ошибок в любом случае.