diff --git a/SSU.cpp b/SSU.cpp index 2d58c072..6f9a80a6 100644 --- a/SSU.cpp +++ b/SSU.cpp @@ -9,9 +9,10 @@ namespace i2p { namespace transport { - SSUServer::SSUServer (int port): m_Thread (nullptr), m_Work (m_Service), - m_Endpoint (boost::asio::ip::udp::v4 (), port), m_EndpointV6 (boost::asio::ip::udp::v6 (), port), - m_Socket (m_Service, m_Endpoint), m_SocketV6 (m_Service), m_IntroducersUpdateTimer (m_Service) + SSUServer::SSUServer (int port): m_Thread (nullptr), m_ThreadV6 (nullptr), m_Work (m_Service), + m_WorkV6 (m_ServiceV6),m_Endpoint (boost::asio::ip::udp::v4 (), port), + m_EndpointV6 (boost::asio::ip::udp::v6 (), port), m_Socket (m_Service, m_Endpoint), + m_SocketV6 (m_ServiceV6), m_IntroducersUpdateTimer (m_Service) { m_Socket.set_option (boost::asio::socket_base::receive_buffer_size (65535)); m_Socket.set_option (boost::asio::socket_base::send_buffer_size (65535)); @@ -35,7 +36,10 @@ namespace transport m_Thread = new std::thread (std::bind (&SSUServer::Run, this)); m_Service.post (std::bind (&SSUServer::Receive, this)); if (context.SupportsV6 ()) - m_Service.post (std::bind (&SSUServer::ReceiveV6, this)); + { + m_ThreadV6 = new std::thread (std::bind (&SSUServer::RunV6, this)); + m_ServiceV6.post (std::bind (&SSUServer::ReceiveV6, this)); + } if (i2p::context.IsUnreachable ()) ScheduleIntroducersUpdateTimer (); } @@ -46,12 +50,20 @@ namespace transport m_IsRunning = false; m_Service.stop (); m_Socket.close (); + m_ServiceV6.stop (); + m_SocketV6.close (); if (m_Thread) { m_Thread->join (); delete m_Thread; - m_Thread = 0; - } + m_Thread = nullptr; + } + if (m_ThreadV6) + { + m_ThreadV6->join (); + delete m_ThreadV6; + m_ThreadV6 = nullptr; + } } void SSUServer::Run () @@ -68,7 +80,22 @@ namespace transport } } } - + + void SSUServer::RunV6 () + { + while (m_IsRunning) + { + try + { + m_ServiceV6.run (); + } + catch (std::exception& ex) + { + LogPrint (eLogError, "SSU V6 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 08fde8ea..1e3624a4 100644 --- a/SSU.h +++ b/SSU.h @@ -47,6 +47,7 @@ namespace transport private: void Run (); + void RunV6 (); void Receive (); void ReceiveV6 (); void HandleReceivedFrom (const boost::system::error_code& ecode, std::size_t bytes_transferred); @@ -63,9 +64,9 @@ namespace transport private: bool m_IsRunning; - std::thread * m_Thread; - boost::asio::io_service m_Service; - boost::asio::io_service::work m_Work; + std::thread * m_Thread, * m_ThreadV6; + boost::asio::io_service m_Service, m_ServiceV6; + boost::asio::io_service::work m_Work, m_WorkV6; boost::asio::ip::udp::endpoint m_Endpoint, m_EndpointV6; boost::asio::ip::udp::socket m_Socket, m_SocketV6; boost::asio::ip::udp::endpoint m_SenderEndpoint, m_SenderEndpointV6;