78 SocketAddress::
SocketAddress(
const SockAddr& sockAddr, SockLen sockAddrLen,
bool numeric)
81 char hostC[NI_MAXHOST];
82 char servC[NI_MAXSERV];
83 std::memset(hostC, 0, NI_MAXHOST);
84 std::memset(servC, 0, NI_MAXSERV);
86 const int aiErrCode = core::system::getnameinfo(
reinterpret_cast<
const sockaddr*>(&sockAddr),
92 NI_NUMERICSERV | (numeric ? NI_NUMERICHOST : NI_NAMEREQD));
94 if (servC[0] !=
'\0') {
95 this->port =
static_cast<uint16_t>(std::stoul(servC));
99 this->canonName = hostC;
101 core::socket::State state = core::socket::STATE_OK;
105 state = core::socket::STATE_ERROR;
108 state = core::socket::STATE_FATAL;
112 throw core::socket::SocketAddress::BadSocketAddress(
113 state, aiErrCode == EAI_SYSTEM ? strerror(errno) : gai_strerror(aiErrCode), aiErrCode == EAI_SYSTEM ? errno : aiErrCode);
118 addrinfo addrInfoHints{};
120 addrInfoHints.ai_family = Super::getAddressFamily();
121 addrInfoHints.ai_flags = hints.aiFlags | AI_ADDRCONFIG |
123 addrInfoHints.ai_socktype = hints.aiSockType;
124 addrInfoHints.ai_protocol = hints.aiProtocol;
126 const int aiErrCode = socketAddrInfo->resolve(host, std::to_string(port), addrInfoHints);
127 if (aiErrCode == 0) {
128 sockAddr = socketAddrInfo->getSockAddr();
129 canonName = socketAddrInfo->getCanonName();
131 core::socket::State state = core::socket::STATE_OK;
136 state = core::socket::STATE_ERROR;
139 state = core::socket::STATE_FATAL;
143 throw core::socket::SocketAddress::BadSocketAddress(state,
144 host +
":" + std::to_string(port) +
" - " +
145 (aiErrCode == EAI_SYSTEM ? strerror(errno) : gai_strerror(aiErrCode)),
146 (aiErrCode == EAI_SYSTEM ? errno : aiErrCode));