C++ 远程\u终结点:未连接传输终结点

C++ 远程\u终结点:未连接传输终结点,c++,linux,boost-asio,C++,Linux,Boost Asio,异常是从Linux上运行的io\u服务发出的 事情就是这样。我使用Boost.Asio实现了简单的异步echo服务器。它是单线程的,所有内容都是异步的,也就是说,我只使用异步版本的accept、send和receive函数。当客户端未正常断开连接(例如崩溃)时,服务器的事件循环抛出boost::system::system\u错误异常远程\u端点:未连接传输端点。它为什么会发生?如何处理?这是由信号管引起的吗?如果是这样,保持服务器运行的最佳方法是什么?句柄异常或句柄信号?异常表示调用了的引发版

异常是从Linux上运行的
io\u服务发出的


事情就是这样。我使用Boost.Asio实现了简单的异步echo服务器。它是单线程的,所有内容都是异步的,也就是说,我只使用异步版本的accept、send和receive函数。当客户端未正常断开连接(例如崩溃)时,服务器的事件循环抛出boost::system::system\u错误异常远程\u端点:未连接传输端点。它为什么会发生?如何处理?这是由信号管引起的吗?如果是这样,保持服务器运行的最佳方法是什么?句柄异常或句柄信号?

异常表示调用了的引发版本,其中在基础调用中返回的错误为
ENOTCONN
。根据文档,处理程序中抛出的异常允许通过抛出线程调用
run()
run\u one()
poll()
,或
poll\u one()
,向上传播

要解决这个问题,请考虑:


  • 调用的非抛出版本,并适当处理错误:

    boost::system::error_code ec;
    boost::asio::ip::tcp::endpoint endpoint = socket.remote_endpoint(ec);
    if (ec)
    {
      // An error occurred.  Stop the asynchronous call chain for
      // this connection.
    }
    
  • try
    /
    catch
    块中调用
    run()
    。文档中提到了以下代码:

    boost::asio::io_service io_service;
    ...
    for (;;)
    {
      try
      {
        io_service.run();
        break; // run() exited normally
      }
      catch (my_exception& e)
      {
        // Deal with exception as appropriate.
      }
    }
    
    使用这种方法,线程可以重新调用,而无需调用
    io\u服务


调用函数的非抛出版本不是解决问题的方法。要解决这个问题,首先要找出为什么会出现异常“remote_endpoint:Transport endpoint未连接”。