Обработка ошибок в перекрывающемся сокете IO - PullRequest
1 голос
/ 14 мая 2011

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

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

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

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

1 Ответ

1 голос
/ 14 мая 2011

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

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

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

Внутренний элемент был изначально зарезервирован для использования системой, и его поведение может измениться.

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

...