Обработка ошибок в перекрывающихся сокетах ввода-вывода

Может ли кто-нибудь предложить надежный способ обработки системных ошибок в случае использования перекрывающихся сокетов IO и IOCP?

Описание MSDN в этом аспекте громоздко. В нем говорится, что для GetQueuedCompletionStatus кода возврата FALSE должен быть последующий вызов GetLastError для получения кода ошибки при неудачной операции. Однако мы знаем, что для WSA-функций вместо этого следует вызывать WSAGetLastError (GetLastError возвращает 0 при ошибке сокета). Итак, первая часть вопроса - как это работает на практике?

Другая проблема заключается в обработке ошибок, если пакеты завершения извлекаются GetQueuedCompletionStatusEx. MSDN описывает только обработку ошибок для самого этого вызова, ничего не говоря о получении кодов ошибок отдельных неудачных операций.

Заранее спасибо за все ответы и комментарии.


person Krit    schedule 13.05.2011    source источник


Ответы (1)


После нескольких часов экспериментов и изучения MSDN с увеличительным стеклом я обнаружил следующее:

http://msdn.microsoft.com/en-us/library/ms684342%28v=VS.85%29.aspx (статья о структуре OVERLAPPED, описание поля Internal):

Код ошибки для запроса ввода/вывода. При отправке запроса система устанавливает для этого члена значение STATUS_PENDING, чтобы указать, что операция еще не началась. Когда запрос завершен, система устанавливает для этого члена код ошибки для завершенного запроса.

Элемент Internal изначально был зарезервирован для системного использования, и его поведение может измениться.

Последняя фраза выглядит не очень хорошо, но я думаю, что это то, что есть.

person Krit    schedule 14.05.2011