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