SNode.C
Loading...
Searching...
No Matches
SocketAddrInfo.cpp
Go to the documentation of this file.
1
/*
2
* SNode.C - A Slim Toolkit for Network Communication
3
* Copyright (C) Volker Christian <me@vchrist.at>
4
* 2020, 2021, 2022, 2023, 2024, 2025, 2026
5
*
6
* This program is free software: you can redistribute it and/or modify
7
* it under the terms of the GNU Lesser General Public License as published
8
* by the Free Software Foundation, either version 3 of the License, or
9
* (at your option) any later version.
10
*
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public License
17
* along with this program. If not, see <http://www.gnu.org/licenses/>.
18
*/
19
20
/*
21
* MIT License
22
*
23
* Permission is hereby granted, free of charge, to any person obtaining a copy
24
* of this software and associated documentation files (the "Software"), to deal
25
* in the Software without restriction, including without limitation the rights
26
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
27
* copies of the Software, and to permit persons to whom the Software is
28
* furnished to do so, subject to the following conditions:
29
*
30
* The above copyright notice and this permission notice shall be included in
31
* all copies or substantial portions of the Software.
32
*
33
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
36
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
37
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
38
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
39
* THE SOFTWARE.
40
*/
41
42
#
include
"net/in/SocketAddrInfo.h"
43
44
#
ifndef
DOXYGEN_SHOULD_SKIP_THIS
45
46
#
include
"log/Logger.h"
47
48
#
include
<
cstring
>
49
#
include
<
netinet
/
in
.
h
>
50
#
include
<
sstream
>
51
52
#
endif
/* DOXYGEN_SHOULD_SKIP_THIS */
53
54
namespace
net::in {
55
56
SocketAddrInfo
::~
SocketAddrInfo
() {
57
if
(
addrInfo
!=
nullptr
) {
58
freeaddrinfo(
addrInfo
);
59
}
60
}
61
62
int
SocketAddrInfo
::resolve(
const
std::string& node,
const
std::string& service,
const
addrinfo& hints) {
63
if
(
addrInfo
!=
nullptr
) {
64
freeaddrinfo(
addrInfo
);
65
addrInfo
=
nullptr
;
66
}
67
68
int
aiErrCode = 0;
69
70
if
((aiErrCode = core
::
system
::
getaddrinfo
(node.c_str(), service.c_str(), &hints, &
addrInfo
)) == 0) {
71
currentAddrInfo
=
addrInfo
;
72
}
73
74
return
aiErrCode;
75
}
76
77
bool
SocketAddrInfo
::
useNext
() {
78
// Lookup for a AddrInfo holding a ai_next AddrInfo which differ from the current one.
79
// Especially localhost on IPv4 can lead to more than one entries representing the same SockAddr.
80
// Thus, do not use this further SockAddr.
81
while
(
currentAddrInfo
!=
nullptr
&&
currentAddrInfo
->ai_next !=
nullptr
&&
82
std::memcmp(
currentAddrInfo
->ai_addr,
currentAddrInfo
->ai_next->ai_addr,
sizeof
(sockaddr_in)) == 0) {
83
currentAddrInfo
=
currentAddrInfo
->ai_next;
84
}
85
86
if
(
currentAddrInfo
!=
nullptr
) {
87
currentAddrInfo
=
currentAddrInfo
->ai_next;
88
}
89
90
return
currentAddrInfo
!=
nullptr
;
91
}
92
93
sockaddr_in
SocketAddrInfo
::
getSockAddr
() {
94
return
currentAddrInfo
!=
nullptr
? *
reinterpret_cast
<sockaddr_in*>(
currentAddrInfo
->ai_addr)
// cppcheck-suppress internalAstError
95
: sockaddr_in{.sin_family = AF_INET, .sin_port{}, .sin_addr{}, .sin_zero{}};
96
}
97
98
std::string
SocketAddrInfo
::
getCanonName
() {
99
return
currentAddrInfo
->ai_canonname !=
nullptr
?
currentAddrInfo
->ai_canonname : std::string{};
100
}
101
102
void
SocketAddrInfo
::
logAddressInfo
() {
103
if
(
currentAddrInfo
!=
nullptr
) {
104
static
char
hostBfr[NI_MAXHOST];
105
static
char
servBfr[NI_MAXSERV];
106
std::memset(hostBfr, 0, NI_MAXHOST);
107
std::memset(servBfr, 0, NI_MAXSERV);
108
109
getnameinfo(
currentAddrInfo
->ai_addr,
110
currentAddrInfo
->ai_addrlen,
111
hostBfr,
112
sizeof
(hostBfr),
113
servBfr,
114
sizeof
(servBfr),
115
NI_NUMERICHOST | NI_NUMERICSERV);
116
117
const
struct
sockaddr_in* aiAddr =
reinterpret_cast
<sockaddr_in*>(
currentAddrInfo
->ai_addr);
118
119
std::ostringstream formatted;
120
formatted <<
"AddressInfo:\n"
121
<<
" ai_next = "
<<
currentAddrInfo
->ai_next <<
"\n"
122
<<
" ai_flags = "
<<
currentAddrInfo
->ai_flags <<
"\n"
123
<<
" ai_family = "
<<
currentAddrInfo
->ai_family <<
" (PF_INET = "
<< PF_INET <<
", PF_INET6 = "
<< PF_INET6
124
<<
")\n"
125
<<
" ai_socktype = "
<<
currentAddrInfo
->ai_socktype <<
" (SOCK_STREAM = "
<< SOCK_STREAM
126
<<
", SOCK_DGRAM = "
<< SOCK_DGRAM <<
")\n"
127
<<
" ai_protocol = "
<<
currentAddrInfo
->ai_protocol <<
" (IPPROTO_TCP = "
<< IPPROTO_TCP
128
<<
", IPPROTO_UDP = "
<< IPPROTO_UDP <<
")\n"
129
<<
" ai_addrlen = "
<<
currentAddrInfo
->ai_addrlen <<
" (sockaddr_in = "
<<
sizeof
(
struct
sockaddr_in)
130
<<
", sockaddr_in6 = "
<<
sizeof
(
struct
sockaddr_in6) <<
")\n"
131
<<
" ai_addr = sin_family: "
<< aiAddr->sin_family <<
" (AF_INET = "
<< AF_INET
132
<<
", AF_INET6 = "
<< AF_INET6 <<
")\n"
133
<<
" sin_addr: "
<< hostBfr <<
"\n"
134
<<
" sin_port: "
<< servBfr;
135
136
LOG
(
TRACE
) << formatted.str();
137
}
138
}
139
140
}
// namespace net::in
LOG
#define LOG(level)
Definition
Logger.h:148
logger::LogMessage::LogMessage
LogMessage(Level level, int verboseLevel=-1, bool withErrno=false)
Definition
Logger.cpp:280
net::in::SocketAddrInfo
Definition
SocketAddrInfo.h:57
net::in::SocketAddrInfo::getCanonName
std::string getCanonName()
Definition
SocketAddrInfo.cpp:98
net::in::SocketAddrInfo::addrInfo
struct addrinfo * addrInfo
Definition
SocketAddrInfo.h:72
net::in::SocketAddrInfo::getSockAddr
sockaddr_in getSockAddr()
Definition
SocketAddrInfo.cpp:93
net::in::SocketAddrInfo::useNext
bool useNext()
Definition
SocketAddrInfo.cpp:77
net::in::SocketAddrInfo::currentAddrInfo
struct addrinfo * currentAddrInfo
Definition
SocketAddrInfo.h:73
net::in::SocketAddrInfo::~SocketAddrInfo
~SocketAddrInfo()
Definition
SocketAddrInfo.cpp:56
net::in::SocketAddrInfo::logAddressInfo
void logAddressInfo()
Definition
SocketAddrInfo.cpp:102
core::system
Definition
dlfcn.cpp:50
core::system::getaddrinfo
int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res)
Definition
netdb.cpp:62
logger::Level::TRACE
@ TRACE
Definition
Logger.h:90
net
in
SocketAddrInfo.cpp
Generated on
for SNode.C by
1.15.0