From 998653ea9dfc0fb10099d72a8ee0efe8e7ef7508 Mon Sep 17 00:00:00 2001 From: orignal Date: Mon, 23 Jul 2018 15:30:51 -0400 Subject: [PATCH] NTCP2 acceptors --- libi2pd/NTCP2.cpp | 98 +++++++++++++++++++++++++++++++++++++++++++++++ libi2pd/NTCP2.h | 5 +++ 2 files changed, 103 insertions(+) diff --git a/libi2pd/NTCP2.cpp b/libi2pd/NTCP2.cpp index 94f0641e..e5487a4e 100644 --- a/libi2pd/NTCP2.cpp +++ b/libi2pd/NTCP2.cpp @@ -776,6 +776,48 @@ namespace transport { m_IsRunning = true; m_Thread = new std::thread (std::bind (&NTCP2Server::Run, this)); + auto& addresses = context.GetRouterInfo ().GetAddresses (); + for (const auto& address: addresses) + { + if (!address) continue; + if (address->IsPublishedNTCP2 ()) + { + if (address->host.is_v4()) + { + try + { + m_NTCP2Acceptor.reset (new boost::asio::ip::tcp::acceptor (m_Service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), address->port))); + } + catch ( std::exception & ex ) + { + LogPrint(eLogError, "NTCP2: Failed to bind to ip4 port ",address->port, ex.what()); + continue; + } + + LogPrint (eLogInfo, "NTC2P: Start listening TCP port ", address->port); + auto conn = std::make_shared(*this); + m_NTCP2Acceptor->async_accept(conn->GetSocket (), std::bind (&NTCP2Server::HandleAccept, this, conn, std::placeholders::_1)); + } + else if (address->host.is_v6() && context.SupportsV6 ()) + { + m_NTCP2V6Acceptor.reset (new boost::asio::ip::tcp::acceptor (m_Service)); + try + { + m_NTCP2V6Acceptor->open (boost::asio::ip::tcp::v6()); + m_NTCP2V6Acceptor->set_option (boost::asio::ip::v6_only (true)); + m_NTCP2V6Acceptor->bind (boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v6(), address->port)); + m_NTCP2V6Acceptor->listen (); + + LogPrint (eLogInfo, "NTCP2: Start listening V6 TCP port ", address->port); + auto conn = std::make_shared (*this); + m_NTCP2V6Acceptor->async_accept(conn->GetSocket (), std::bind (&NTCP2Server::HandleAcceptV6, this, conn, std::placeholders::_1)); + } catch ( std::exception & ex ) { + LogPrint(eLogError, "NTCP: failed to bind to ip6 port ", address->port); + continue; + } + } + } + } } } @@ -786,6 +828,8 @@ namespace transport auto ntcpSessions = m_NTCP2Sessions; for (auto& it: ntcpSessions) it.second->Terminate (); + for (auto& it: m_PendingIncomingSessions) + it->Terminate (); } m_NTCP2Sessions.clear (); @@ -871,6 +915,60 @@ namespace transport conn->ClientLogin (); } } + + void NTCP2Server::HandleAccept (std::shared_ptr conn, const boost::system::error_code& error) + { + if (!error) + { + boost::system::error_code ec; + auto ep = conn->GetSocket ().remote_endpoint(ec); + if (!ec) + { + LogPrint (eLogDebug, "NTCP2: Connected from ", ep); + if (conn) + { + conn->ServerLogin (); + // m_PendingIncomingSessions.push_back (conn); + } + } + else + LogPrint (eLogError, "NTCP2: Connected from error ", ec.message ()); + } + + if (error != boost::asio::error::operation_aborted) + { + conn = std::make_shared (*this); + m_NTCP2Acceptor->async_accept(conn->GetSocket (), std::bind (&NTCP2Server::HandleAccept, this, + conn, std::placeholders::_1)); + } + } + + void NTCP2Server::HandleAcceptV6 (std::shared_ptr conn, const boost::system::error_code& error) + { + if (!error) + { + boost::system::error_code ec; + auto ep = conn->GetSocket ().remote_endpoint(ec); + if (!ec) + { + LogPrint (eLogDebug, "NTCP2: Connected from ", ep); + if (conn) + { + conn->ServerLogin (); + // m_PendingIncomingSessions.push_back (conn); + } + } + else + LogPrint (eLogError, "NTCP2: Connected from error ", ec.message ()); + } + + if (error != boost::asio::error::operation_aborted) + { + conn = std::make_shared (*this); + m_NTCP2V6Acceptor->async_accept(conn->GetSocket (), std::bind (&NTCP2Server::HandleAcceptV6, this, + conn, std::placeholders::_1)); + } + } } } diff --git a/libi2pd/NTCP2.h b/libi2pd/NTCP2.h index c14c6876..93a2ac1e 100644 --- a/libi2pd/NTCP2.h +++ b/libi2pd/NTCP2.h @@ -155,6 +155,9 @@ namespace transport private: void Run (); + void HandleAccept (std::shared_ptr conn, const boost::system::error_code& error); + void HandleAcceptV6 (std::shared_ptr conn, const boost::system::error_code& error); + void HandleConnect (const boost::system::error_code& ecode, std::shared_ptr conn); private: @@ -163,7 +166,9 @@ namespace transport std::thread * m_Thread; boost::asio::io_service m_Service; boost::asio::io_service::work m_Work; + std::unique_ptr m_NTCP2Acceptor, m_NTCP2V6Acceptor; std::map > m_NTCP2Sessions; + std::list > m_PendingIncomingSessions; public: