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