Какие коды ошибок / условия Boost возвращаются при вызове Boost.Asio?

В настоящее время я пишу средство ввода-вывода TCP, которое использует Boost.Asio в качестве основного API сокета, и я заметил, что Похоже, в Boost.Asio отсутствует документация о том, какие конкретные коды / условия ошибок Boost могут возникнуть в результате каждой отдельной операции. (например, вызов функции / метода или асинхронная операция). Все, что я смог найти, это API кода ошибки и некоторые неофициальные списки кодов ошибок, ни один из которых не соотносит конкретные коды с конкретными операциями.

Это очевидное отсутствие документации расстраивает, потому что трудно написать надежный код, когда вы не знаете возможных режимов сбоев. Невозможно даже привести примеры, так как я даже не уверен, какие проблемы могут возникнуть из-за отсутствия операций из-за отсутствия документации.

Для сравнения, API-интерфейс сокетов POSIX довольно неплох при документировании режимов сбоев. В частности, в нем перечислены errno и возвращаемые значения, которые могут быть сгенерированы каждым вызовом функции.

Существует ли эта документация Boost.Asio где-нибудь, а я ее просто не вижу? Или я должен просто угадать, перепроектировать или собрать эмпирические данные о режимах сбоев различных частей API Boost.Asio, чтобы иметь возможность писать надежный код, который его использует?

1

Решение

В общем, когда Boost.Asio зависит от реализации ОС, он не будет указывать ни условия, при которых могут возникать ошибки, ни коды ошибок, которые могут быть возвращены. При неудаче Boost.Asio заполнит boost::system::error_code если приложение способно принимать его, например, для асинхронных операций или синхронных перегрузок операций с error_code параметр; в противном случае он выдаст исключение, содержащее error_code, документация заявляет следующее:

Если не указано иное, когда поведение асинхронной операции определяется «как будто», реализованной функцией POSIX, обработчик будет вызываться со значением типа error_code это соответствует условию сбоя, описанному POSIX для этой функции, если таковая имеется. В противном случае обработчик будет вызываться с определенной реализацией error_code значение, которое отражает ошибку операционной системы.

Асинхронные операции не завершатся с ошибкой, которая указывает на прерывание по сигналу (POSIX EINTR). Асинхронные операции не завершатся с ошибкой, связанной с неблокирующими операциями (POSIX EWOULDBLOCK, EAGAIN или же EINPROGRESS; Windows WSAEWOULDBLOCK или же WSAEINPROGRESS).

Если обработка ошибок зависит от точного кода ошибки, то часто можно использовать Документация по отображению API BSD определить, какие вызовы ОС делаются. Затем можно использовать соответствующую документацию для ОС, чтобы определить условия возникновения ошибки и значения. Отображение между кодами ошибок и кодами ошибок Boost.Asio находится в asio/error.hpp, но отображение обычно довольно простое.

2

Другие решения