Каковы будут значения этих параметров, когда GetQueuedCompletionStatus() вернет FALSE?

Есть две причины, которые могут вызвать GetQueuedCompletionStatus() потерпеть неудачу FALSE), во-первых, потому что дескриптор порта завершения, связанный с ним, закрыт, в то время как вызов является ожидающим, это будет иметь место, если lpOverlapped является NULL,

Вторая причина (о которой я забочусь) заключается в том, что операция ввода-вывода (например: WSARecv()) не удается Вот что говорит документация об этой ситуации:

Если *lpOverlapped не равен NULL, и функция удаляет пакет завершения для неудачной операции ввода-вывода из порта завершения, функция сохраняет информацию о неудачной операции в переменных, на которые указывают lpNumberOfBytes, lpCompletionKey и lpOverlapped. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Я не считаю, что это очень ясно, каковы значения lpNumberOfBytes, lpCompletionKey, а также lpOverlapped будет. Будут ли эти параметры содержать те же значения, которые я указал при вызове WSARecv()? Я предполагаю, что это более вероятно, потому что, как еще я должен знать, какая операция ввода-вывода вызвала сбой!

1 ответ

Решение

Если операция ввода-вывода завершается неудачей, lpCompletionKey а также lpOverlapped будут значения, которые были предоставлены, когда вы инициировали операцию ввода-вывода с использованием любого API-интерфейса (WSASend(), WSARecv(), так далее.). Таким образом вы определяете данные "на устройство" и "на операцию" для рассматриваемой операции ввода / вывода.

lpNumberOfBytes в ситуациях с ошибками, вероятно, будет равен нулю, хотя я склонен иметь дело с ним так же, как и с ошибками, поскольку я никогда не использую результирующее значение (или содержимое буфера) во время обработки ошибок в любом случае.

Другие вопросы по тегам