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
73 SocketAddress::
SocketAddress(
const std::string& ipOrHostname, uint16_t port)
79 SocketAddress::
SocketAddress(
const SockAddr& sockAddr, SockLen sockAddrLen,
bool numeric)
82 char hostC[NI_MAXHOST];
83 char servC[NI_MAXSERV];
84 std::memset(hostC, 0, NI_MAXHOST);
85 std::memset(servC, 0, NI_MAXSERV);
87 const int aiErrCode = core::system::getnameinfo(
reinterpret_cast<
const sockaddr*>(&sockAddr),
93 NI_NUMERICSERV | (numeric ? NI_NUMERICHOST : NI_NAMEREQD));
96 this->port = (servC[0] !=
'\0') ?
static_cast<uint16_t>(std::stoul(servC)) : 0;
98 core::socket::
State state = core::socket::STATE_OK;
102 state = core::socket::STATE_ERROR;
105 state = core::socket::STATE_FATAL;
109 throw core::socket::SocketAddress::BadSocketAddress(
110 state, aiErrCode == EAI_SYSTEM ? strerror(errno) : gai_strerror(aiErrCode), aiErrCode == EAI_SYSTEM ? errno : aiErrCode);
115 addrinfo addrInfoHints{};
118 addrInfoHints.ai_flags = hints.aiFlags | AI_ADDRCONFIG |
124 if (aiErrCode == 0) {
128 core::socket::
State state = core::socket::STATE_OK;
133 state = core::socket::STATE_ERROR;
136 state = core::socket::STATE_FATAL;
140 throw core::socket::SocketAddress::BadSocketAddress(state,
141 host +
":" + std::to_string(port) +
": " +
142 (aiErrCode == EAI_SYSTEM ? strerror(errno) : gai_strerror(aiErrCode)),
143 (aiErrCode == EAI_SYSTEM ? errno : aiErrCode));
147 SocketAddress& SocketAddress::
setHost(
const std::string& ipOrHostname) {
148 this->host = ipOrHostname;
157 SocketAddress& SocketAddress::
setPort(uint16_t port) {
171 std::string SocketAddress::
toString(
bool expanded)
const {
172 return std::string(
host).append(std::string(
":")
173 .append(std::to_string(
port))
174 .append(expanded && !
canonName.empty() ? std::string(
" (").append(
canonName).append(
")") :
""));
177 std::string SocketAddress::
getEndpoint(
const std::string_view& format)
const {
178 return std::vformat(format, std::make_format_args((
port)));
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 getEndpoint(const std::string_view &format={}) const override
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)