diff --git a/I2PTunnel.cpp b/I2PTunnel.cpp index 0f9188b6..fdc5bc52 100644 --- a/I2PTunnel.cpp +++ b/I2PTunnel.cpp @@ -92,8 +92,15 @@ namespace client m_Stream->Close (); m_Stream.reset (); } - m_Socket->close (); - Done(shared_from_this ()); + auto s = shared_from_this (); + // make sure all outstading jobs finished before close + m_Socket->get_io_service ().post( + [s]() + { + s->m_Socket->close (); + }); + + Done(s); } void I2PTunnelConnection::Receive () diff --git a/Streaming.h b/Streaming.h index bf19f92a..65a8d8b4 100644 --- a/Streaming.h +++ b/Streaming.h @@ -285,7 +285,7 @@ namespace stream auto s = shared_from_this(); m_Service.post ([=](void) { - if (!m_ReceiveQueue.empty () || m_Status == eStreamStatusReset || m_Status == eStreamStatusClosed) + if (!m_ReceiveQueue.empty () || m_Status == eStreamStatusReset) s->HandleReceiveTimer (boost::asio::error::make_error_code (boost::asio::error::operation_aborted), buffer, handler, 0); else { @@ -306,7 +306,7 @@ namespace stream else if (ecode == boost::asio::error::operation_aborted) { // timeout not expired - if (m_Status == eStreamStatusReset || m_Status == eStreamStatusClosed) + if (m_Status == eStreamStatusReset) handler (boost::asio::error::make_error_code (boost::asio::error::connection_reset), 0); else handler (boost::asio::error::make_error_code (boost::asio::error::operation_aborted), 0);