diff --git a/SSU.cpp b/SSU.cpp index 761d0e6b..2f2baf30 100644 --- a/SSU.cpp +++ b/SSU.cpp @@ -992,8 +992,8 @@ namespace ssu m_Server.Send (buf, msgSize, m_RemoteEndpoint); } - SSUServer::SSUServer (boost::asio::io_service& service, int port): - m_Endpoint (boost::asio::ip::udp::v4 (), port), m_Socket (service, m_Endpoint) + SSUServer::SSUServer (int port): m_Thread (nullptr), m_Work (m_Service), + m_Endpoint (boost::asio::ip::udp::v4 (), port), m_Socket (m_Service, m_Endpoint) { m_Socket.set_option (boost::asio::socket_base::receive_buffer_size (65535)); m_Socket.set_option (boost::asio::socket_base::send_buffer_size (65535)); @@ -1007,15 +1007,40 @@ namespace ssu void SSUServer::Start () { - Receive (); + m_IsRunning = true; + m_Thread = new std::thread (std::bind (&SSUServer::Run, this)); + m_Service.post (boost::bind (&SSUServer::Receive, this)); } void SSUServer::Stop () { DeleteAllSessions (); + m_IsRunning = false; + m_Service.stop (); m_Socket.close (); + if (m_Thread) + { + m_Thread->join (); + delete m_Thread; + m_Thread = 0; + } } + void SSUServer::Run () + { + while (m_IsRunning) + { + try + { + m_Service.run (); + } + catch (std::exception& ex) + { + LogPrint ("SSU server: ", ex.what ()); + } + } + } + void SSUServer::AddRelay (uint32_t tag, const boost::asio::ip::udp::endpoint& relay) { m_Relays[tag] = relay; diff --git a/SSU.h b/SSU.h index 95198d21..2d874335 100644 --- a/SSU.h +++ b/SSU.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -154,7 +155,7 @@ namespace ssu { public: - SSUServer (boost::asio::io_service& service, int port); + SSUServer (int port); ~SSUServer (); void Start (); void Stop (); @@ -172,11 +173,16 @@ namespace ssu private: + void Run (); void Receive (); void HandleReceivedFrom (const boost::system::error_code& ecode, std::size_t bytes_transferred); private: - + + bool m_IsRunning; + std::thread * m_Thread; + boost::asio::io_service m_Service; + boost::asio::io_service::work m_Work; boost::asio::ip::udp::endpoint m_Endpoint; boost::asio::ip::udp::socket m_Socket; boost::asio::ip::udp::endpoint m_SenderEndpoint; diff --git a/Transports.cpp b/Transports.cpp index d7bdd634..249e5f0e 100644 --- a/Transports.cpp +++ b/Transports.cpp @@ -110,7 +110,7 @@ namespace i2p { if (!m_SSUServer) { - m_SSUServer = new i2p::ssu::SSUServer (m_Service, address.port); + m_SSUServer = new i2p::ssu::SSUServer (address.port); LogPrint ("Start listening UDP port ", address.port); m_SSUServer->Start (); DetectExternalIP ();