Nix (Dev) 3.5.10
dev - 3.5.10 - 1af9301
Loading...
Searching...
No Matches
CSocketAddress.hpp
Go to the documentation of this file.
1#ifndef LIBS_COMM_CSOCKETADDRESS_HPP_
2#define LIBS_COMM_CSOCKETADDRESS_HPP_
3
5#include "core/defines.hpp"
6
7#include <cstring>
8#include <iostream>
9#include <memory>
10#include <stdexcept>
11#include <sys/un.h>
12
13namespace iv::comms::socket
14{
15
16template<typename T>
18{
19protected:
20 std::unique_ptr<T> m_sockaddr;
21 sa_family_t m_family;
22 std::string m_address;
23 uint16_t m_port;
24
25public:
26 SocketAddress(std::string_view address, uint16_t port)
27 {
28 m_sockaddr = std::make_unique<T>();
29 m_address = address;
30 m_port = port;
31
32 if constexpr (std::is_same<T, sockaddr_in>::value)
33 {
34 m_sockaddr->sin_family = AF_INET;
35 m_sockaddr->sin_port = htons(port);
36 if (inet_pton(AF_INET, address, &m_sockaddr->sin_addr) <= 0)
37 {
38 throw std::runtime_error("Invalid address");
39 }
40 }
41 else if constexpr (std::is_same<T, sockaddr_in6>::value)
42 {
43 m_sockaddr->sin6_family = AF_INET6;
44 m_sockaddr->sin6_port = htons(port);
45 if (inet_pton(AF_INET6, address, &m_sockaddr->sin6_addr) <= 0)
46 {
47 throw std::runtime_error("Invalid address");
48 }
49 }
50 else
51 {
52 throw std::runtime_error("Invalid address family");
53 }
54 }
55
56 ~SocketAddress() = default;
57
58 [[nodiscard]] sockaddr *getSocketAddress() const
59 {
60 return reinterpret_cast<sockaddr *>(m_sockaddr.get());
61 }
62
63 [[nodiscard]] std::string getAdresss() const
64 {
65 return m_address;
66 }
67
68 [[nodiscard]] uint16_t getPort() const
69 {
70 return m_port;
71 }
72
73 [[nodiscard]] socklen_t size() const
74 {
75 return sizeof(*m_sockaddr);
76 }
77
78 [[nodiscard]] sa_family_t getFamily() const
79 {
80 return m_family;
81 }
82};
83
84using IPv4Address = SocketAddress<sockaddr_in>;
85using IPv6Address = SocketAddress<sockaddr_in6>;
86
87}// namespace iv::comms::socket
88
89// TODO: Rename to AbstractSocketAddress
91{
92public:
93 virtual ~CSocketAddress() = default;
94 [[nodiscard]] virtual socklen_t size() const = 0;
95
96 virtual sockaddr *getSocketAddress() = 0;
97 [[nodiscard]] const virtual sockaddr *getSocketAddress() const = 0;
98
99 [[nodiscard]] virtual sa_family_t getFamily() const
100 {
101 auto p = getSocketAddress();
102 return p ? p->sa_family : AF_UNSPEC;
103 }
104};
105
107{
108public:
109 CSocketAddressAny() = default;
110
111 CSocketAddressAny(const sockaddr *address, socklen_t size)
112 {
113 if (size > kPrvMaxSize)
114 {
115 throw std::length_error("Address length out of range");
116 }
117
118 std::memcpy(&m_address, address, m_size = size);
119 }
120
121 CSocketAddressAny(const sockaddr_storage &address, socklen_t size)
122 {
123 if (size > kPrvMaxSize)
124 {
125 throw std::length_error("Address length out of range");
126 }
127
128 std::memcpy(&m_address, &address, m_size = size);
129 }
130
131 [[nodiscard]] socklen_t size() const override
132 {
133 return m_size;
134 }
135
136 sockaddr *getSocketAddress() override
137 {
138 return reinterpret_cast<sockaddr *>(&m_address);
139 }
140
141 [[nodiscard]] const sockaddr *getSocketAddress() const override
142 {
143 return reinterpret_cast<const sockaddr *>(&m_address);
144 }
145
146private:
147 sockaddr_storage m_address {};
148 socklen_t m_size {kPrvMaxSize};
149
150 static constexpr size_t kPrvMaxSize = sizeof(sockaddr_storage);
151};
152
153class CIpV4Address final : public CSocketAddress
154{
155public:
156 static constexpr sa_family_t ADDRESS_FAMILY = AF_INET;
157
158 CIpV4Address() = default;
159
160 explicit CIpV4Address(in_port_t port)
161 {
162 create(in_addr_t(INADDR_ANY), port);
163 }
164
165 CIpV4Address(in_addr_t address, in_port_t port)
166 {
167 create(address, port);
168 }
169
170 CIpV4Address(const iv::types::ipAddress &address, in_port_t port)
171 {
172 create(address, port);
173 }
174
175 explicit CIpV4Address(const sockaddr &address)
176 {
177 std::memcpy(&m_address, &address, kSizeAddressStruct);
178 }
179
180 explicit CIpV4Address(const CSocketAddress &address)
181 {
182 std::memcpy(&m_address, address.getSocketAddress(), kSizeAddressStruct);
183 }
184
185 explicit CIpV4Address(const sockaddr_in &address) : m_address(address)
186 {
187 }
188
189 CIpV4Address(const CIpV4Address &address) : m_address(address.m_address)
190 {
191 }
192
193 uint8_t operator[](int32_t i) const
194 {
195 in_addr_t addr = getAddress();
196
197 return ((const uint8_t *) &addr)[i];
198 }
199
200 void create(in_addr_t address, in_port_t port);
201 void create(const iv::types::ipAddress &address, in_port_t port);
202
203 [[nodiscard]] std::string ip() const
204 {
205 return inet_ntoa(m_address.sin_addr);
206 }
207
208 static in_addr_t resolveName(const iv::types::ipAddress &address);
209 [[nodiscard]] std::string toString() const;
210
211 [[nodiscard]] in_addr_t getAddress() const
212 {
213 return ntohl(m_address.sin_addr.s_addr);
214 }
215
216 [[nodiscard]] in_port_t getPort() const
217 {
218 return ntohs(m_address.sin_port);
219 }
220
221 [[nodiscard]] socklen_t size() const override
222 {
223 return socklen_t(kSizeAddressStruct);
224 }
225
226 sockaddr *getSocketAddress() override
227 {
228 return reinterpret_cast<sockaddr *>(&m_address);
229 }
230
231 [[nodiscard]] const sockaddr *getSocketAddress() const override
232 {
233 return reinterpret_cast<const sockaddr *>(&m_address);
234 }
235
236 sockaddr_in *getSocketAddressIn()
237 {
238 return static_cast<sockaddr_in *>(&m_address);
239 }
240
241 [[nodiscard]] const sockaddr_in *getSocketAddressIn() const
242 {
243 return static_cast<const sockaddr_in *>(&m_address);
244 }
245
246 [[nodiscard]] bool isSet() const;
247
248private:
249 sockaddr_in m_address {};
250
251 static constexpr size_t kSizeAddressStruct = sizeof(sockaddr_in);
252};
253
255{
256public:
257 static constexpr sa_family_t ADDRESS_FAMILY = AF_INET6;
258
260 {
261 }
262
263 explicit CIpV6Address(in_port_t port)
264 {
265 const in6_addr ANY IN6ADDR_ANY_INIT;
266
267 create(ANY, port);
268 }
269
270 CIpV6Address(const std::string &address, in_port_t port)
271 {
272 create(address, port);
273 }
274
275 explicit CIpV6Address(const sockaddr_storage &address)
276 {
277 std::memcpy(&m_address, &address, kSizeAddressStruct);
278 }
279
280 explicit CIpV6Address(const CSocketAddress &address)
281 {
282 std::memcpy(&m_address, address.getSocketAddress(), kSizeAddressStruct);
283 }
284
285 explicit CIpV6Address(const sockaddr_in6 &address)
286 {
287 std::memcpy(&m_address, &address, kSizeAddressStruct);
288 }
289
290 CIpV6Address(const CIpV6Address &address) : m_address(address.m_address)
291 {
292 }
293
294 uint8_t operator[](int32_t i) const
295 {
296 return m_address.sin6_addr.s6_addr[i];
297 }
298
299 void create(const in6_addr &address, in_port_t port);
300 void create(const std::string &address, in_port_t port);
301
302 static CIpV6Address loopBack(in_port_t port)
303 {
304 const in6_addr LOOPBACK IN6ADDR_LOOPBACK_INIT;
305 CIpV6Address addr;
306
307 addr.create(LOOPBACK, port);
308
309 return addr;
310 }
311
312 static in6_addr resolveName(const std::string &address);
313
314 [[nodiscard]] std::string toString() const;
315
316 [[nodiscard]] in6_addr getAddress() const
317 {
318 return m_address.sin6_addr;
319 }
320
321 [[nodiscard]] in_port_t getPort() const
322 {
323 return ntohs(m_address.sin6_port);
324 }
325
326 [[nodiscard]] socklen_t size() const override
327 {
328 return socklen_t(kSizeAddressStruct);
329 }
330
331 [[nodiscard]] const sockaddr *getSocketAddress() const override
332 {
333 return reinterpret_cast<const sockaddr *>(&m_address);
334 }
335
336 sockaddr *getSocketAddress() override
337 {
338 return reinterpret_cast<sockaddr *>(&m_address);
339 }
340
341 [[nodiscard]] const sockaddr_in6 *getSocketAddressIn6() const
342 {
343 return &m_address;
344 }
345
346 sockaddr_in6 *getSocketAddressIn6()
347 {
348 return &m_address;
349 }
350
351 [[nodiscard]] bool isSet() const;
352
353private:
354 sockaddr_in6 m_address {};
355
356 static constexpr size_t kSizeAddressStruct = sizeof(sockaddr_in6);
357};
358
359std::ostream &operator<<(std::ostream &os, const CIpV4Address &address);
360std::ostream &operator<<(std::ostream &os, const CIpV6Address &address);
361
362#endif /* LIBS_COMM_CSOCKETADDRESS_HPP_ */
std::ostream & operator<<(std::ostream &os, const CIpV4Address &address)
Definition CSocketAddress.cpp:137
Definition CSocketAddress.hpp:154
std::string toString() const
Definition CSocketAddress.cpp:54
static constexpr size_t kSizeAddressStruct
Definition CSocketAddress.hpp:251
static constexpr sa_family_t ADDRESS_FAMILY
Definition CSocketAddress.hpp:156
CIpV4Address(in_addr_t address, in_port_t port)
Definition CSocketAddress.hpp:165
bool isSet() const
Definition CSocketAddress.cpp:62
CIpV4Address()=default
const sockaddr_in * getSocketAddressIn() const
Definition CSocketAddress.hpp:241
CIpV4Address(const CIpV4Address &address)
Definition CSocketAddress.hpp:189
const sockaddr * getSocketAddress() const override
Definition CSocketAddress.hpp:231
CIpV4Address(in_port_t port)
Definition CSocketAddress.hpp:160
sockaddr_in m_address
Definition CSocketAddress.hpp:249
uint8_t operator[](int32_t i) const
Definition CSocketAddress.hpp:193
static in_addr_t resolveName(const iv::types::ipAddress &address)
Definition CSocketAddress.cpp:21
in_addr_t getAddress() const
Definition CSocketAddress.hpp:211
CIpV4Address(const CSocketAddress &address)
Definition CSocketAddress.hpp:180
void create(in_addr_t address, in_port_t port)
Definition CSocketAddress.cpp:5
CIpV4Address(const sockaddr_in &address)
Definition CSocketAddress.hpp:185
sockaddr * getSocketAddress() override
Definition CSocketAddress.hpp:226
sockaddr_in * getSocketAddressIn()
Definition CSocketAddress.hpp:236
socklen_t size() const override
Definition CSocketAddress.hpp:221
in_port_t getPort() const
Definition CSocketAddress.hpp:216
CIpV4Address(const sockaddr &address)
Definition CSocketAddress.hpp:175
CIpV4Address(const iv::types::ipAddress &address, in_port_t port)
Definition CSocketAddress.hpp:170
std::string ip() const
Definition CSocketAddress.hpp:203
Definition CSocketAddress.hpp:255
std::string toString() const
Definition CSocketAddress.cpp:121
socklen_t size() const override
Definition CSocketAddress.hpp:326
sockaddr_in6 m_address
Definition CSocketAddress.hpp:354
CIpV6Address()
Definition CSocketAddress.hpp:259
static in6_addr resolveName(const std::string &address)
Definition CSocketAddress.cpp:87
CIpV6Address(const sockaddr_storage &address)
Definition CSocketAddress.hpp:275
CIpV6Address(const CSocketAddress &address)
Definition CSocketAddress.hpp:280
in_port_t getPort() const
Definition CSocketAddress.hpp:321
const sockaddr * getSocketAddress() const override
Definition CSocketAddress.hpp:331
static constexpr sa_family_t ADDRESS_FAMILY
Definition CSocketAddress.hpp:257
sockaddr * getSocketAddress() override
Definition CSocketAddress.hpp:336
static CIpV6Address loopBack(in_port_t port)
Definition CSocketAddress.hpp:302
void create(const in6_addr &address, in_port_t port)
Definition CSocketAddress.cpp:69
in6_addr getAddress() const
Definition CSocketAddress.hpp:316
const sockaddr_in6 * getSocketAddressIn6() const
Definition CSocketAddress.hpp:341
CIpV6Address(const sockaddr_in6 &address)
Definition CSocketAddress.hpp:285
CIpV6Address(const std::string &address, in_port_t port)
Definition CSocketAddress.hpp:270
uint8_t operator[](int32_t i) const
Definition CSocketAddress.hpp:294
bool isSet() const
Definition CSocketAddress.cpp:130
static constexpr size_t kSizeAddressStruct
Definition CSocketAddress.hpp:356
CIpV6Address(in_port_t port)
Definition CSocketAddress.hpp:263
sockaddr_in6 * getSocketAddressIn6()
Definition CSocketAddress.hpp:346
CIpV6Address(const CIpV6Address &address)
Definition CSocketAddress.hpp:290
Definition CSocketAddress.hpp:107
const sockaddr * getSocketAddress() const override
Definition CSocketAddress.hpp:141
static constexpr size_t kPrvMaxSize
Definition CSocketAddress.hpp:150
CSocketAddressAny()=default
CSocketAddressAny(const sockaddr_storage &address, socklen_t size)
Definition CSocketAddress.hpp:121
sockaddr_storage m_address
Definition CSocketAddress.hpp:147
sockaddr * getSocketAddress() override
Definition CSocketAddress.hpp:136
socklen_t m_size
Definition CSocketAddress.hpp:148
CSocketAddressAny(const sockaddr *address, socklen_t size)
Definition CSocketAddress.hpp:111
socklen_t size() const override
Definition CSocketAddress.hpp:131
Definition CSocketAddress.hpp:91
virtual const sockaddr * getSocketAddress() const =0
virtual sa_family_t getFamily() const
Definition CSocketAddress.hpp:99
virtual ~CSocketAddress()=default
virtual sockaddr * getSocketAddress()=0
virtual socklen_t size() const =0
Definition CSocketAddress.hpp:18
uint16_t getPort() const
Definition CSocketAddress.hpp:68
socklen_t size() const
Definition CSocketAddress.hpp:73
SocketAddress(std::string_view address, uint16_t port)
Definition CSocketAddress.hpp:26
std::unique_ptr< T > m_sockaddr
Definition address.hpp:17
sockaddr * getSocketAddress() const
Definition CSocketAddress.hpp:58
sa_family_t getFamily() const
Definition CSocketAddress.hpp:78
std::string m_address
Definition address.hpp:19
std::string getAdresss() const
Definition CSocketAddress.hpp:63
sa_family_t m_family
Definition address.hpp:18
uint16_t m_port
Definition address.hpp:20
Definition address.hpp:12
SocketAddress< sockaddr_in6 > IPv6Address
Definition address.hpp:84
SocketAddress< sockaddr_in > IPv4Address
Definition address.hpp:83
std::string ipAddress
Definition types.hpp:40