Windows上的boost.asio错误代码是否依赖于平台?

时间:2014-11-13 06:57:06

标签: c++ boost boost-asio

我正在编写一个小型网络客户端程序,它使用boost.asio作为 网络层,这是一个用于转换错误代码的函数 boost.asio到我的程序的错误代码。

今天我发现如果我的客户端程序在服务器启动时启动 没有打开,连接将失败,boost.asio的错误代码将不会 ' ASIO ::错误:: connection_refused'或者' system :: errc :: connection_refused' 但是' ERROR_CONNECTION_REFUSED',这是一个依赖于Windows平台的 错误代码,为了解决这个问题,我在代码中添加了一个宏,但我认为 这太丑了。

inline ErrorCode::Code cast(const boost::system::error_code& ec, ErrorCode::Code d = ErrorCode::unknownError)
{
    if (ec == boost::asio::error::operation_aborted) {
        return ErrorCode::operationCanceled;
    }
    if (ec == boost::system::errc::connection_refused || ec == boost::asio::error::connection_refused) {
        return ErrorCode::connectionRefused;
    }

    if (ec.category() == boost::system::get_system_category()) {
#if defined(BOOST_ASIO_WINDOWS)
        if (ec.value() == ERROR_CONNECTION_REFUSED) {
            return ErrorCode::connectionRefused;
        }
#endif
    }
    return d;
}

还有其他正确的方法可以解决这个问题吗?


我很困惑,default_error_condition的值仍然是1225, 在我的电脑上,' boost :: system :: errc :: connection_refused'是107, 和' boost :: asio :: error :: connection_refused'是10061。

那么与平台无关的错误代码在哪里?

1 个答案:

答案 0 :(得分:3)

您好像希望在此使用error_condition代替error_code

  

Class error_condition

     

error_condition描述了一个用于保存标识错误条件的值的对象。 [注意:error_condition值是可移植的抽象,而error_code值是特定于实现的。 - 后注]

文档建议error_code::default_error_condition应该适合您。

此页面非常有趣:http://en.highscore.de/cpp/boost/errorhandling.html

  

本章介绍两个Boost C ++库,帮助开发人员利用错误处理:Boost.System将特定于操作系统的错误代码转换为独立于平台的错误代码

     

boost :: system :: error_condition就像boost :: system :: error_code一样使用。可以为boost :: system :: error_condition对象调用value()和category()方法,如上例所示。

     

两个或多或少相同的类的原因相当简单:虽然boost::system::error_code用于平台相关的错误代码,但boost::system::error_condition用于访问与平台无关的错误代码。通过调用default_error_condition()方法,平台相关的错误代码将转换为类型为boost::system::error_condition的平台无关错误代码。

相关问题