56 SocketAddress::
SocketAddress(
const SockAddr& sockAddr, SockLen sockAddrLen,
bool numeric)
59 char hostC[NI_MAXHOST];
60 char servC[NI_MAXSERV];
61 std::memset(hostC, 0, NI_MAXHOST);
62 std::memset(servC, 0, NI_MAXSERV);
64 const int aiErrCode = core::system::getnameinfo(
reinterpret_cast<
const sockaddr*>(&sockAddr),
70 NI_NUMERICSERV | (numeric ? NI_NUMERICHOST : NI_NAMEREQD));
72 if (servC[0] !=
'\0') {
73 this->port =
static_cast<uint16_t>(std::stoul(servC));
77 this->canonName = hostC;
79 core::socket::State state = core::socket::STATE_OK;
83 state = core::socket::STATE_ERROR;
86 state = core::socket::STATE_FATAL;
90 throw core::socket::SocketAddress::BadSocketAddress(
91 state, aiErrCode == EAI_SYSTEM ? strerror(errno) : gai_strerror(aiErrCode), aiErrCode == EAI_SYSTEM ? errno : aiErrCode);
96 addrinfo addrInfoHints{};
98 addrInfoHints.ai_family = Super::getAddressFamily();
99 addrInfoHints.ai_flags =
100 hints.aiFlags | AI_ADDRCONFIG | AI_CANONNAME | AI_ALL;
101 addrInfoHints.ai_socktype = hints.aiSockType;
102 addrInfoHints.ai_protocol = hints.aiProtocol;
104 const int aiErrCode = socketAddrInfo->resolve(host, std::to_string(port), addrInfoHints);
105 if (aiErrCode == 0) {
106 sockAddr = socketAddrInfo->getSockAddr();
107 canonName = socketAddrInfo->getCanonName();
109 core::socket::State state = core::socket::STATE_OK;
114 state = core::socket::STATE_ERROR;
117 state = core::socket::STATE_FATAL;
121 throw core::socket::SocketAddress::BadSocketAddress(state,
122 host +
":" + std::to_string(port) +
" - " +
123 (aiErrCode == EAI_SYSTEM ? strerror(errno) : gai_strerror(aiErrCode)),
124 (aiErrCode == EAI_SYSTEM ? errno : aiErrCode));