#include "net/net_utils_base.h" #include #include "string_tools.h" #include "net/local_ip.h" namespace epee { namespace net_utils { const uint8_t ipv4_network_address::ID; bool ipv4_network_address::equal(const ipv4_network_address& other) const noexcept { return is_same_host(other) && port() == other.port(); } bool ipv4_network_address::less(const ipv4_network_address& other) const noexcept { return is_same_host(other) ? port() < other.port() : ip() < other.ip(); } std::string ipv4_network_address::str() const { return string_tools::get_ip_string_from_int32(ip()) + ":" + std::to_string(port()); } std::string ipv4_network_address::host_str() const { return string_tools::get_ip_string_from_int32(ip()); } bool ipv4_network_address::is_loopback() const { return net_utils::is_ip_loopback(ip()); } bool ipv4_network_address::is_local() const { return net_utils::is_ip_local(ip()); } bool network_address::equal(const network_address& other) const { // clang typeid workaround network_address::interface const* const self_ = self.get(); network_address::interface const* const other_self = other.self.get(); if (self_ == other_self) return true; if (!self_ || !other_self) return false; if (typeid(*self_) != typeid(*other_self)) return false; return self_->equal(*other_self); } bool network_address::less(const network_address& other) const { // clang typeid workaround network_address::interface const* const self_ = self.get(); network_address::interface const* const other_self = other.self.get(); if (self_ == other_self) return false; if (!self_ || !other_self) return self == nullptr; if (typeid(*self_) != typeid(*other_self)) return self_->get_type_id() < other_self->get_type_id(); return self_->less(*other_self); } bool network_address::is_same_host(const network_address& other) const { // clang typeid workaround network_address::interface const* const self_ = self.get(); network_address::interface const* const other_self = other.self.get(); if (self_ == other_self) return true; if (!self_ || !other_self) return false; if (typeid(*self_) != typeid(*other_self)) return false; return self_->is_same_host(*other_self); } bool create_network_address(network_address &address, const std::string &string, uint16_t default_port) { uint32_t ip; uint16_t port; if (epee::string_tools::parse_peer_from_string(ip, port, string)) { if (default_port && !port) port = default_port; address = ipv4_network_address{ip, port}; return true; } return false; } std::string print_connection_context(const connection_context_base& ctx) { std::stringstream ss; ss << ctx.m_remote_address.str() << " " << ctx.m_connection_id << (ctx.m_is_income ? " INC":" OUT"); return ss.str(); } std::string print_connection_context_short(const connection_context_base& ctx) { std::stringstream ss; ss << ctx.m_remote_address.str() << (ctx.m_is_income ? " INC":" OUT"); return ss.str(); } }}