diff --git a/NTCPSession.cpp b/NTCPSession.cpp index 61e7944f..3e3d551d 100644 --- a/NTCPSession.cpp +++ b/NTCPSession.cpp @@ -517,10 +517,10 @@ namespace ntcp } - NTCPClient::NTCPClient (boost::asio::io_service& service, const char * address, + NTCPClient::NTCPClient (boost::asio::io_service& service, const boost::asio::ip::address& address, int port, i2p::data::RouterInfo& in_RouterInfo): NTCPSession (service, in_RouterInfo), - m_Endpoint (boost::asio::ip::address::from_string (address), port) + m_Endpoint (address, port) { Connect (); } diff --git a/NTCPSession.h b/NTCPSession.h index 5d33ef10..71cf5af9 100644 --- a/NTCPSession.h +++ b/NTCPSession.h @@ -144,7 +144,7 @@ namespace ntcp { public: - NTCPClient (boost::asio::io_service& service, const char * address, int port, i2p::data::RouterInfo& in_RouterInfo); + NTCPClient (boost::asio::io_service& service, const boost::asio::ip::address& address, int port, i2p::data::RouterInfo& in_RouterInfo); private: diff --git a/RouterContext.cpp b/RouterContext.cpp index d3e1def1..3274f82d 100644 --- a/RouterContext.cpp +++ b/RouterContext.cpp @@ -45,7 +45,7 @@ namespace i2p auto address = m_RouterInfo.GetNTCPAddress (); if (address) { - address->host = host; + address->host = boost::asio::ip::address::from_string (host); address->port = port; } @@ -80,4 +80,4 @@ namespace i2p std::ofstream fi(ROUTER_INFO, std::ios::binary); fi.write ((char *)m_RouterInfo.GetBuffer (), m_RouterInfo.GetBufferLen ()); } -} \ No newline at end of file +} diff --git a/RouterInfo.cpp b/RouterInfo.cpp index a0c40dd7..c804cadb 100644 --- a/RouterInfo.cpp +++ b/RouterInfo.cpp @@ -101,7 +101,16 @@ namespace data r += ReadString (value, s); s.seekg (1, std::ios_base::cur); r++; // ; if (!strcmp (key, "host")) - address.host = value; + { + boost::system::error_code ecode; + address.host = boost::asio::ip::address::from_string (value, ecode); + if (ecode) + { + // TODO: we should try to resolve address here + LogPrint ("Unexpected address ", value); + SetUnreachable (true); + } + } else if (!strcmp (key, "port")) address.port = boost::lexical_cast(value); } @@ -166,7 +175,7 @@ namespace data std::stringstream properties; WriteString ("host", properties); properties << '='; - WriteString (address.host, properties); + WriteString (address.host.to_string (), properties); properties << ';'; WriteString ("port", properties); properties << '='; @@ -237,7 +246,7 @@ namespace data void RouterInfo::AddNTCPAddress (const char * host, int port) { Address addr; - addr.host = host; + addr.host = boost::asio::ip::address::from_string (host); addr.port = port; addr.transportStyle = eTransportNTCP; addr.cost = 2; @@ -266,22 +275,28 @@ namespace data return false; } - bool RouterInfo::IsNTCP () const + bool RouterInfo::IsNTCP (bool v4only) const { for (auto& address : m_Addresses) { if (address.transportStyle == eTransportNTCP) - return true; + { + if (!v4only || address.host.is_v4 ()) + return true; + } } return false; } - RouterInfo::Address * RouterInfo::GetNTCPAddress () + RouterInfo::Address * RouterInfo::GetNTCPAddress (bool v4only) { for (auto& address : m_Addresses) { if (address.transportStyle == eTransportNTCP) - return &address; + { + if (!v4only || address.host.is_v4 ()) + return &address; + } } return nullptr; } diff --git a/RouterInfo.h b/RouterInfo.h index a8d59adf..44dae3f1 100644 --- a/RouterInfo.h +++ b/RouterInfo.h @@ -27,7 +27,7 @@ namespace data struct Address { TransportStyle transportStyle; - std::string host; + boost::asio::ip::address host; int port; uint64_t date; uint8_t cost; @@ -45,14 +45,14 @@ namespace data const char * GetIdentHashAbbreviation () const { return m_IdentHashAbbreviation; }; uint64_t GetTimestamp () const { return m_Timestamp; }; const std::vector
& GetAddresses () const { return m_Addresses; }; - Address * GetNTCPAddress (); + Address * GetNTCPAddress (bool v4only = true); const RoutingKey& GetRoutingKey () const { return m_RoutingKey; }; void AddNTCPAddress (const char * host, int port); void SetProperty (const char * key, const char * value); const char * GetProperty (const char * key) const; bool IsFloodfill () const; - bool IsNTCP () const; + bool IsNTCP (bool v4only = true) const; void SetUnreachable (bool unreachable) { m_IsUnreachable = unreachable; }; bool IsUnreachable () const { return m_IsUnreachable; }; diff --git a/Transports.cpp b/Transports.cpp index 371ea2e6..31d0325f 100644 --- a/Transports.cpp +++ b/Transports.cpp @@ -139,7 +139,7 @@ namespace i2p auto address = r->GetNTCPAddress (); if (address) { - session = new i2p::ntcp::NTCPClient (m_Service, address->host.c_str (), address->port, *r); + session = new i2p::ntcp::NTCPClient (m_Service, address->host, address->port, *r); AddNTCPSession (session); } else