C++ 什么时候关闭boost asio tcp套接字是安全的?

C++ 什么时候关闭boost asio tcp套接字是安全的?,c++,boost-asio,C++,Boost Asio,我有一个应用程序,它通过以下方式异步连接到tcp套接字: basic_socket::async_connect 使用以下方法关闭插座: socket.shutdown(boost::asio::ip::tcp::socket::shutdown_both) socket.close() 通过以下方式向插座写入数据: boost::asio::write 我一直在调查一个从中引发异常的问题 boost::asio::write。然后调用析构函数,该析构函数使用上述过程关闭套接字。发生这种情

我有一个应用程序,它通过以下方式异步连接到tcp套接字:

basic_socket::async_connect
使用以下方法关闭插座:

socket.shutdown(boost::asio::ip::tcp::socket::shutdown_both)
socket.close()
通过以下方式向插座写入数据:

boost::asio::write
我一直在调查一个从中引发异常的问题 boost::asio::write。然后调用析构函数,该析构函数使用上述过程关闭套接字。发生这种情况时,我会出现以下错误:

terminate called after throwing an instance of 'myexceptionclass<boost::system::error_code>'
旁白:发生这种情况的原因是由于以下asio问题:。如果我启动服务器,然后立即启动客户端,它无法正确检测到有时服务器未完全初始化,继续写入,然后抛出异常。在这种情况下,这个问题很少发生

我所做的修复只是在低级别(写操作周围)检测异常,如果抛出异常,则不要关闭套接字(我假设这是自动发生的)。然而,我并不完全满意这个修复


现在我的问题是:如果套接字写入引发异常,这是否意味着套接字在所有情况下都不需要显式关闭?或者换句话说:是否可以从写函数抛出异常,而套接字仍然需要显式关闭?基本上,我什么时候才能确切知道何时需要显式关闭?

为什么不捕获异常?
boost::asio::write
只需发送它告诉用户,“是的,套接字已经关闭,我无法再编写了”。用a来理解会更好。我知道,这就是问题的根源。我必须完全重构我的设计来解决这个问题。稍后可能会发布答案。
16591 Aborted    (core dumped)