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));
95 if (servC[0] !=
'\0') {
96 this->port =
static_cast<uint16_t>(std::stoul(servC));
102 core::socket::
State state = core::socket::STATE_OK;
106 state = core::socket::STATE_ERROR;
109 state = core::socket::STATE_FATAL;
113 throw core::socket::SocketAddress::BadSocketAddress(
114 state, aiErrCode == EAI_SYSTEM ? strerror(errno) : gai_strerror(aiErrCode), aiErrCode == EAI_SYSTEM ? errno : aiErrCode);
119 addrinfo addrInfoHints{};
122 addrInfoHints.ai_flags = hints.aiFlags | AI_ADDRCONFIG |
128 if (aiErrCode == 0) {
132 core::socket::
State state = core::socket::STATE_OK;
137 state = core::socket::STATE_ERROR;
140 state = core::socket::STATE_FATAL;
144 throw core::socket::SocketAddress::BadSocketAddress(state,
145 host +
":" + std::to_string(port) +
" - " +
146 (aiErrCode == EAI_SYSTEM ? strerror(errno) : gai_strerror(aiErrCode)),
147 (aiErrCode == EAI_SYSTEM ? errno : aiErrCode));
151 SocketAddress& SocketAddress::
setHost(
const std::string& ipOrHostname) {
152 this->host = ipOrHostname;
161 SocketAddress& SocketAddress::
setPort(uint16_t port) {
175 std::string SocketAddress::
toString(
bool expanded)
const {
176 return std::string(
host).append(expanded ? std::string(
":").append(std::to_string(
port)).append(
" (").append(
canonName).append(
")")
180 std::string SocketAddress::
getEndpoint(
const std::string_view& format)
const {
181 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)