remote_endpoint:传输端点未连接

exception是从io_service:run发出的io_service:run在Linux上运行。

这是发生了什么事。 我使用Boost.Asio实现了简单的asynchronous回显服务器。 它是单线程的,一切都是asynchronous的,那就是我只使用asynchronous版本的接受,发送和接收函数。 当客户端没有正常断开(例如崩溃)时,服务器的事件循环会抛出boost :: system :: system_errorexceptionremote_endpoint:传输端点没有连接 。 为什么会发生一个如何处理呢? 是由SIGPIPE信号引起的吗? 如果是这样,保持服务器运行的最佳方式是什么? 处理exception或处理信号?

这个异常表明调用了basic_stream_socket::remote_endpoint()的抛出版本,其中对getpeername()的底层调用返回了错误ENOTCONN 。 根据处理程序文档抛出的异常的影响,处理程序中抛出的异常可以通过抛出线程对run()run_one()poll()poll_one()的调用来传播。

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

  • 调用basic_stream_socket::remote_endpoint()的非basic_stream_socket::remote_endpoint()版本,并正确处理错误:

     boost::system::error_code ec; boost::asio::ip::tcp::endpoint endpoint = socket.remote_endpoint(ec); if (ec) { // An error occurred. Stop the asynchronousous 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. } } 

    采用这种方法,线程可以重新调用run()而不需要调用io_service上的reset()