2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
42#include "net/in6/SocketAddress.h"
44#include "core/socket/State.h"
45#include "net/SocketAddress.hpp"
46#include "net/in6/SocketAddrInfo.h"
48#ifndef DOXYGEN_SHOULD_SKIP_THIS
72 SocketAddress::
SocketAddress(
const std::string& ipOrHostname, uint16_t port)
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));
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{};
121 addrInfoHints.ai_flags = hints.aiFlags | AI_ADDRCONFIG |
127 if (aiErrCode == 0) {
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));
150 SocketAddress& SocketAddress::
setHost(
const std::string& ipOrHostname) {
151 this->host = ipOrHostname;
160 SocketAddress& SocketAddress::
setPort(uint16_t port) {
174 std::string SocketAddress::
toString(
bool expanded)
const {
175 return std::string(
host).append(expanded ? std::string(
":").append(std::to_string(
port)).append(
" (").append(
canonName).append(
")")
SocketAddress(const SockAddr &sockAddr, SockLen sockAddrLen)
SocketAddress(sa_family_t af, SockLen sockAddrLen=sizeof(SockAddr))
sa_family_t getAddressFamily() const
std::string getCanonName()
sockaddr_in6 getSockAddr()
SocketAddress(uint16_t port)
SocketAddress & setHost(const std::string &ipOrHostname)
SocketAddress & setPort(uint16_t port)
void init(const Hints &hints={.aiFlags=0,.aiSockType=0,.aiProtocol=0})
std::string getCanonName() const
SocketAddress(const std::string &ipOrHostname)
std::string getHost() const
std::string toString(bool expanded=true) const override
std::shared_ptr< SocketAddrInfo > socketAddrInfo
SocketAddress(const std::string &ipOrHostname, uint16_t port)
SocketAddress(const SockAddr &sockAddr, SockLen sockAddrLen, bool numeric=true)