INETSockAddr::INETSockAddr (const char* hostname, int port) { TRACE_CALL; (void) ::memset (addr_in(), 0, size ()); sin_port = htons (port); setAddr (hostname); // sets sin_family }
INETSockAddr::INETSockAddr (unsigned long address, int port) { TRACE_CALL; (void) ::memset (addr_in(), 0, size ()); sin_family = PF_INET; sin_addr.s_addr = htonl (address); sin_port = htons (port); }
int Address::compare(const Address& a) const { if (family() != a.family()) { return family() < a.family() ? -1 : 1; } if (family() == AF_INET) { if (addr_in()->sin_addr.s_addr != a.addr_in()->sin_addr.s_addr) { return addr_in()->sin_addr.s_addr < a.addr_in()->sin_addr.s_addr ? -1 : 1; } } else if (family() == AF_INET6) { return memcmp(&(addr_in6()->sin6_addr), &(a.addr_in6()->sin6_addr), sizeof(addr_in6()->sin6_addr)); } else { assert(false); return -1; } return 0; }
INETSockAddr::INETSockAddr (int port) { TRACE_CALL; (void) ::memset (addr_in(), 0, size ()); sin_family = PF_INET; sin_addr.s_addr = htonl(INADDR_ANY); sin_port = htons (port); }
uint8_t Address::to_inet(uint8_t* data) const { if (family() == AF_INET) { memcpy(data, &addr_in()->sin_addr, 4); return 4; } else { memcpy(data, &addr_in6()->sin6_addr, 16); return 16; } }
int Address::port() const { if (family() == AF_INET) { return htons(addr_in()->sin_port); } else if (family() == AF_INET6) { return htons(addr_in6()->sin6_port); } else { assert(false); return -1; } }
int INETSockAddr::clone (sockaddr*& buf) const { TRACE_CALL; buf = 0; sockaddr_in* sin_addr = new sockaddr_in (*addr_in ()); if (sin_addr) buf = reinterpret_cast<sockaddr*> (sin_addr); return buf ? 0 : -1; }
std::string Address::to_string(bool with_port) const { std::stringstream ss; char host[INET6_ADDRSTRLEN + 1] = {'\0'}; if (family() == AF_INET) { uv_ip4_name(const_cast<struct sockaddr_in*>(addr_in()), host, INET_ADDRSTRLEN); ss << host; if (with_port) ss << ":" << port(); } else if (family() == AF_INET6) { uv_ip6_name(const_cast<struct sockaddr_in6*>(addr_in6()), host, INET6_ADDRSTRLEN); if (with_port) ss << "["; ss << host; if (with_port) ss << "]:" << port(); } else { assert(false); } return ss.str(); }
sockaddr* INETSockAddr::addr () { TRACE_CALL; return reinterpret_cast<sockaddr*> (addr_in()); }