#include "socket/address.h" #include namespace Network { Address::Address() { zeroFill(); } Address::Address(int type, gsl::czstring presentationAddr, std::uint16_t port) { set(type, presentationAddr, port); } void Address::zeroFill() { memset(&addr_in6, 0, sizeof(addr_in6)); } void Address::set(int type, gsl::czstring presentationAddr, std::uint16_t port) { setType(type); if (type == AF_INET) { addr_in.sin_family = AF_INET; ::inet_pton(AF_INET, presentationAddr, &addr_in.sin_addr); addr_in.sin_port = htons(port); } else if (type == AF_INET6) { addr_in6.sin6_family = AF_INET6; ::inet_pton(AF_INET6, presentationAddr, &addr_in6.sin6_addr); addr_in6.sin6_port = htons(port); } family = type; } void Address::setType(int type) { zeroFill(); if (type == AF_INET) length = sizeof(sockaddr_in); else if (type == AF_INET6) length = sizeof(sockaddr_in6); } Address::operator std::string() { std::optional port = getPort(); if (!port) return std::string(); if (family == AF_INET) { char addrStr[INET_ADDRSTRLEN]; ::inet_ntop(AF_INET, &addr_in.sin_addr, addrStr, sizeof(addrStr)); return std::format("{}:{}", addrStr, port.value()); } else if (family == AF_INET6) { char addrStr[INET6_ADDRSTRLEN]; ::inet_ntop(AF_INET6, &addr_in6.sin6_addr, addrStr, sizeof(addrStr)); return std::format("{}:{}", addrStr, port.value()); } return std::string(); } std::uint16_t Address::getPort() const { if (length == sizeof(addr_in)) return ntohs(addr_in.sin_port); else if (length == sizeof(addr_in6)) return ntohs(addr_in6.sin6_port); else return 0; } } // namespace Network