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:
parent
9c77dbf376
commit
c3cf930f75
|
@ -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.
|
||||||
|
|
|
@ -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)
|
||||||
socket_.shutdown(ignored_ec);
|
{
|
||||||
|
const shared_state &state = static_cast<const shared_state&>(get_state());
|
||||||
|
if (!state.stop_signal_sent)
|
||||||
|
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_)
|
||||||
|
|
Loading…
Reference in New Issue