不理解boost error_codes

时间:2015-12-01 15:42:05

标签: c++ boost boost-asio

我的目标是用平台无关的版本(用于Windows和Linux)替换一个非常简单的winsock实现,该实现非常有效。使用boost来提供abstration层,主要是因为它在组中的其他地方使用,所以在罗马时。它是一个整洁的库/框架,所以这不是一个咆哮......只是没有“得到”它的一些,这可能暴露一些基本缺乏理解..请帮助我获得这样的理解。

我之前所拥有的是服务器和客户端之间非常简单的bing- [bang | bong]通信。客户端发送 bing ,如果一切正常,服务器将回复 bang ,否则 bong 。不需要更多,尽管有添加功能。

现在,为了提升,我找到了各种各样的问题,主要归结为还没有接触到它,但我正在学习(我希望visual studio 2005的intellisense会对它进行编目以使其更容易导航)。我发现read()方法会阻塞,直到连接超时,呈现不起作用,这是持续通信的目标。我认为socket.read_some()方法可能会帮助我...尝试尝试。

我也在尝试重构连接建立代码以用作重新连接方法..这就是我遇到问题的地方。

请考虑以下事项:

boost::system::error_code ServiceMonitorThread::ConnectToPeer(
    tcp::socket &socket,
    tcp::resolver::iterator endpoint_iterator)
{
    boost::system::error_code error;
    int tries = 0;

    for (; tries < maxTriesBeforeAbort; tries++)
    {
        boost::asio::connect(socket, endpoint_iterator, error);

        if (error && error != boost::system::errc::success)
        {
            // Error connecting to service... may not be running?
            string errMsg = boost::system::system_error(error).what();
            cerr << errMsg << endl;
            boost::this_thread::sleep_for(boost::chrono::milliseconds(200));
        }
    }

    if (tries == maxTriesBeforeAbort)
    {
        return boost::system::errc::host_unreachable;
    }

    return error;
}

使用上面的代码片段(尚未调试,可能没有正确使用read_some()):

socket.read_some(boost::asio::buffer(response), error);

switch (error)
{
case boost::system::errc::success:
    break;

case boost::asio::error::eof:
    // Connection was dropped, re-connect to the service.
    error = ConnectToPeer(socket, endpoint_iterator);
    if (error && error == boost::system::errc::host_unreachable)
    {
        TerminateProgram();
    }
    continue;

default:
    // Other error while receiving from socket
    string errMsg = boost::system::system_error(error).what();
    cerr << errMsg << endl;
    retry++;
    continue;
}

现在,我知道error_code和errc :: errc_t不是一回事......但是你看到了我想要完成的目标。如何在boost框架的意图下工作,我如何实现上述目标?

1 个答案:

答案 0 :(得分:1)

boost::system::error_code包含类别和错误代码。它的目的是提供一个异构类型,它可以包含不同子系统的不同错误代码。

注意system::error_code可以转换为bool,并且只有在出现错误时才会评估为true:

auto bytes_read = socket.read_some(boost::asio::buffer(response), error);
if (error)
{
  if (error == make_error_code(boost::asio::error::eof))
  {
    // Connection was dropped, re-connect to the service.
    error = ConnectToPeer(socket, endpoint_iterator);
    if (error && error == make_error_code(boost::system::errc::host_unreachable))
    {
        TerminateProgram();
    }
    continue;
  }
  else 
  {
    cerr << error.message() << endl;
    retry++;
    continue;
  }
}

请参阅boost :: system以获取ADL函数make_error_code的说明。