diff --git a/contrib/epee/include/net/abstract_tcp_server2.h b/contrib/epee/include/net/abstract_tcp_server2.h index d0eabbba5..374a28a2e 100644 --- a/contrib/epee/include/net/abstract_tcp_server2.h +++ b/contrib/epee/include/net/abstract_tcp_server2.h @@ -93,11 +93,12 @@ namespace net_utils struct shared_state : connection_basic_shared_state { shared_state() - : connection_basic_shared_state(), pfilter(nullptr), config() + : connection_basic_shared_state(), pfilter(nullptr), config(), stop_signal_sent(false) {} i_connection_filter* pfilter; typename t_protocol_handler::config_type config; + bool stop_signal_sent; }; /// Construct a connection with the given io_service. diff --git a/contrib/epee/include/net/abstract_tcp_server2.inl b/contrib/epee/include/net/abstract_tcp_server2.inl index 14fbec5d9..821594355 100644 --- a/contrib/epee/include/net/abstract_tcp_server2.inl +++ b/contrib/epee/include/net/abstract_tcp_server2.inl @@ -762,7 +762,11 @@ PRAGMA_WARNING_DISABLE_VS(4355) m_timer.cancel(); boost::system::error_code ignored_ec; if (m_ssl_support == epee::net_utils::ssl_support_t::e_ssl_support_enabled) - socket_.shutdown(ignored_ec); + { + const shared_state &state = static_cast(get_state()); + if (!state.stop_signal_sent) + socket_.shutdown(ignored_ec); + } socket().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored_ec); if (!m_host.empty()) { @@ -1130,6 +1134,8 @@ POP_WARNINGS void boosted_tcp_server::send_stop_signal() { m_stop_signal_sent = true; + typename connection::shared_state *state = static_cast::shared_state*>(m_state.get()); + state->stop_signal_sent = true; TRY_ENTRY(); connections_mutex.lock(); for (auto &c: connections_)