如何避免Boost Asio和C/C++拒绝连接后程序退出

How to avoid the program exit after Connection Refused with Boost Asio and C/C++

本文关键字:连接 拒绝 程序 退出 C++ Boost 何避免 Asio      更新时间:2023-10-16

目前,我正在使用Boost Asio通过TCP连接到服务器。

我使用有条件的情况来决定应用程序是否必须启动与服务器的连接;它工作得很好,但问题是,如果我试图在服务器关闭时连接到服务器,那么应用程序就会崩溃,出现以下错误:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
  what():  Connection refused

这是我正在使用的代码:

    case CONNECTION:
 // Connect to the server
 using boost::asio::ip::tcp;
 boost::asio::io_service io_service;
 tcp::resolver resolver(io_service);
 tcp::resolver::query query(tcp::v4(), server, boost::lexical_cast<string>(porta));
 tcp::resolver::iterator iterator = resolver.resolve(query);
 tcp::socket s(io_service); 
 s.connect(*iterator); 

我想让我的应用程序保持正常行为,只提示连接失败的警告。

如何处理此异常?

您应该使用try ... catch块。他们是这样工作的:

try
{
    s.connect(*iterator);
}
catch (boost::system::system_error const& e)
{
    std::cout << "Warning: could not connect : " << e.what() << std::endl;
}

根据此处的文档,失败时connect会抛出boost::system::system_error。因此,您需要将代码封装在try...catch块中,并捕获上面提到的异常。或者,如果你不想使用异常,你可以使用这里描述的另一个重载,它在出错时返回错误代码。