我正在编写一个小型网络客户端程序,它使用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。
那么与平台无关的错误代码在哪里?
答案 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
的平台无关错误代码。