abstract_tcp_server2: fix timeout on exit

When closing connections due to exiting, the IO service is
already gone, so the data exchange needed for a gracious SSL
shutdown cannot happen. We just close the socket in that case.
This commit is contained in:
moneromooo-monero 2019-04-12 18:12:04 +00:00
parent 9c77dbf376
commit c3cf930f75
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3
2 changed files with 9 additions and 2 deletions

View file

@ -93,11 +93,12 @@ namespace net_utils
struct shared_state : connection_basic_shared_state struct shared_state : connection_basic_shared_state
{ {
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; i_connection_filter* pfilter;
typename t_protocol_handler::config_type config; typename t_protocol_handler::config_type config;
bool stop_signal_sent;
}; };
/// Construct a connection with the given io_service. /// Construct a connection with the given io_service.

View file

@ -762,7 +762,11 @@ PRAGMA_WARNING_DISABLE_VS(4355)
m_timer.cancel(); m_timer.cancel();
boost::system::error_code ignored_ec; boost::system::error_code ignored_ec;
if (m_ssl_support == epee::net_utils::ssl_support_t::e_ssl_support_enabled) if (m_ssl_support == epee::net_utils::ssl_support_t::e_ssl_support_enabled)
{
const shared_state &state = static_cast<const shared_state&>(get_state());
if (!state.stop_signal_sent)
socket_.shutdown(ignored_ec); socket_.shutdown(ignored_ec);
}
socket().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored_ec); socket().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored_ec);
if (!m_host.empty()) if (!m_host.empty())
{ {
@ -1130,6 +1134,8 @@ POP_WARNINGS
void boosted_tcp_server<t_protocol_handler>::send_stop_signal() void boosted_tcp_server<t_protocol_handler>::send_stop_signal()
{ {
m_stop_signal_sent = true; m_stop_signal_sent = true;
typename connection<t_protocol_handler>::shared_state *state = static_cast<typename connection<t_protocol_handler>::shared_state*>(m_state.get());
state->stop_signal_sent = true;
TRY_ENTRY(); TRY_ENTRY();
connections_mutex.lock(); connections_mutex.lock();
for (auto &c: connections_) for (auto &c: connections_)