remote_endpoint:未连接传输端点

时间:2014-03-15 15:16:40

标签: c++ linux boost-asio

Linux上的io_service:run发出异常。

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

1 个答案:

答案 0 :(得分:5)

该异常表示调用了basic_stream_socket::remote_endpoint()的抛出版本,其中getpeername()的基础调用返回时发生错误ENOTCONN。根据{{​​3}}文档,允许在处理程序中抛出的异常通过抛出线程调用run()run_one()poll()或{{}来传播。 1}}。

要解决此问题,请考虑:

  • 调用非抛出版本的effect of exceptions thrown from handlers,并正确处理错误:

    poll_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. } / run()块中调用try。文档中提到了以下代码:

    catch

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