LibSWOC++ 1.5.14
Solid Wall of C++
Loading...
Searching...
No Matches
IPEndpoint.h
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2// Copyright Network Geographics 2014
6
7#pragma once
8
9#include <stdexcept>
10
11#include "swoc/swoc_version.h"
12#include "swoc/MemSpan.h"
13#include "swoc/TextView.h"
15#include "swoc/swoc_ip_util.h"
16
17namespace swoc { inline namespace SWOC_VERSION_NS {
18
19class IPAddr;
20class IP4Addr;
21class IP6Addr;
22
23class IPSrv;
24class IP4Srv;
25class IP6Srv;
26
38 using string_view = std::string_view;
39
40 struct sockaddr sa;
41 struct sockaddr_in sa4;
42 struct sockaddr_in6 sa6;
43
45 IPEndpoint();
46 IPEndpoint(self_type const &that);
47 ~IPEndpoint() = default;
48
50 explicit IPEndpoint(string_view const &text);
51
53 explicit IPEndpoint(IPAddr const &addr);
54
56 explicit IPEndpoint(IPSrv const &srv);
57
59 IPEndpoint(sockaddr const *addr);
60
62 IPEndpoint(sockaddr_in const *sin);
63
65 IPEndpoint(sockaddr_in6 const *sin6);
66
68 self_type &operator=(self_type const &that);
69
83 static bool tokenize(string_view src, string_view *host = nullptr, string_view *port = nullptr, string_view *rest = nullptr);
84
92 bool parse(string_view const &str);
93
95 static void invalidate(sockaddr *addr);
96
99
109 static bool assign(sockaddr *dst, sockaddr const *src);
110
114 self_type &assign(sockaddr const *addr);
115
121 self_type &assign(sockaddr_in const *sin);
122
128 self_type &assign(sockaddr_in6 const *sin6);
129
131 self_type &assign(IPAddr const &addr);
132
133 [[deprecated("Use IPSrv")]] self_type &assign(IPAddr const &addr, in_port_t port);
134
136 self_type &assign(IP4Addr const &addr);
137
139 self_type &assign(IP6Addr const &addr);
140
142 self_type &assign(IP4Srv const &srv);
143
145 self_type &assign(IP6Srv const &srv);
146
148 self_type &assign(IPSrv const &srv);
149
151 const self_type &copy_to(sockaddr *addr) const;
152
154 bool is_valid() const;
155
157 bool is_ip4() const;
158
160 bool is_ip6() const;
161
166 socklen_t size() const;
167
169 sa_family_t family() const;
170
172 sockaddr_in *ip4();
173
175 sockaddr_in const *ip4() const;
176
178 sockaddr_in6 *ip6();
179
181 sockaddr_in6 const *ip6() const;
182
187
189 bool is_any() const;
190
195
197 bool is_loopback() const;
198
200 bool is_link_local() const;
201
203 static bool is_link_local(sockaddr const * sa);
204
206 bool is_private() const;
207
209 static bool is_private(sockaddr const * sa);
210
212 bool is_multicast() const;
213
215 static bool is_multicast(sockaddr const * sa);
216
221 in_port_t network_order_port() const;
222
227 in_port_t host_order_port() const;
228
233 static bool is_valid(sockaddr const *sa);
234
240 static in_port_t &port(sockaddr *sa);
241
247 static in_port_t network_order_port(sockaddr const *sa);
248
254 static in_port_t host_order_port(sockaddr const *sa);
255
257 operator sockaddr *();
258
260 operator sockaddr const *() const;
261
263 size_t sa_size() const;
264
266 static size_t sa_size(sockaddr const* sa);
267
275
277 static string_view family_name(sa_family_t family);
278};
279
281 sa.sa_family = AF_UNSPEC;
282}
283
284inline IPEndpoint::IPEndpoint(IPAddr const &addr) {
285 this->assign(addr);
286}
287
288inline IPEndpoint::IPEndpoint(IPSrv const &srv) {
289 this->assign(srv);
290}
291
292inline IPEndpoint::IPEndpoint(sockaddr const *addr) {
293 this->assign(addr);
294}
295
297
298inline IPEndpoint &
300 sa.sa_family = AF_UNSPEC;
301 return *this;
302}
303
304inline void
305IPEndpoint::invalidate(sockaddr *addr) {
306 addr->sa_family = AF_UNSPEC;
307}
308
309inline bool
311 return sa.sa_family == AF_INET || sa.sa_family == AF_INET6;
312}
313
314inline IPEndpoint &
316 self_type::assign(&sa, &that.sa);
317 return *this;
318}
319
320inline IPEndpoint &
321IPEndpoint::assign(sockaddr_in const *sin) {
322 std::memcpy(&sa4, sin, sizeof(sockaddr_in));
323 return *this;
324}
325
326inline IPEndpoint &
327IPEndpoint::assign(sockaddr_in6 const *sin6) {
328 std::memcpy(&sa6, sin6, sizeof(sockaddr_in6));
329 return *this;
330}
331
332inline IPEndpoint &
333IPEndpoint::assign(sockaddr const *src) {
334 self_type::assign(&sa, src);
335 return *this;
336}
337
338inline IPEndpoint const &
339IPEndpoint::copy_to(sockaddr *addr) const {
340 self_type::assign(addr, &sa);
341 return *this;
342}
343
344inline bool
346 return AF_INET == sa.sa_family;
347}
348
349inline bool
351 return AF_INET6 == sa.sa_family;
352}
353
354inline sa_family_t
356 return sa.sa_family;
357}
358
359inline sockaddr_in *
361 return this->is_ip4() ? &sa4 : nullptr;
362}
363
364inline sockaddr_in const *
366 return this->is_ip4() ? &sa4 : nullptr;
367}
368
369inline sockaddr_in6 *
371 return this->is_ip6() ? &sa6 : nullptr;
372}
373
374inline sockaddr_in6 const *
376 return this->is_ip6() ? &sa6 : nullptr;
377}
378
379inline in_port_t
381 return this->is_valid() ? this->port(const_cast<sockaddr *>(&sa)) : 0;
382}
383
384inline in_port_t
386 return ntohs(this->network_order_port());
387}
388
389inline bool
390IPEndpoint::is_valid(sockaddr const *sa) {
391 return sa && (sa->sa_family == AF_INET || sa->sa_family == AF_INET6);
392}
393
394inline in_port_t &
396 switch (sa->sa_family) {
397 case AF_INET:
398 return reinterpret_cast<sockaddr_in *>(sa)->sin_port;
399 case AF_INET6:
400 return reinterpret_cast<sockaddr_in6 *>(sa)->sin6_port;
401 }
402 // Force a failure upstream by returning a null reference.
403 throw std::domain_error("sockaddr does not contain a valid IP address");
404}
405
406inline in_port_t
408 return self_type::is_valid(sa) ? self_type::port(const_cast<sockaddr *>(sa)) : 0;
409}
410
411inline in_port_t
413 return self_type::is_valid(sa) ? ntohs(self_type::port(const_cast<sockaddr *>(sa))) : 0;
414}
415
418 switch (sa.sa_family) {
419 case AF_INET:
420 return {&sa4.sin_addr, sizeof(sa4.sin_addr)};
421 case AF_INET6:
422 return {&sa6.sin6_addr, sizeof(sa6.sin6_addr)};
423 }
424 return {};
425}
426
427inline bool IPEndpoint::is_link_local() const {
429}
430
431inline bool IPEndpoint::is_link_local(sockaddr const * sa) {
433}
434
435inline bool IPEndpoint::is_private() const {
436 return swoc::ip::is_private(&sa);
437}
438
439inline bool IPEndpoint::is_private(sockaddr const * sa) {
440 return swoc::ip::is_private(sa);
441}
442
443inline bool IPEndpoint::is_multicast() const {
444 return swoc::ip::is_multicast(&sa);
445}
446
447inline bool IPEndpoint::is_multicast(sockaddr const * sa) {
449}
450
451inline IPEndpoint::operator sockaddr *() { return &sa; }
452
453inline IPEndpoint::operator sockaddr const *() const { return &sa; }
454
455inline size_t IPEndpoint::sa_size() const {
456 return sa_size(&sa);
457}
458
459inline size_t IPEndpoint::sa_size(sockaddr const* sa) {
460 return AF_INET == sa->sa_family ? sizeof(sockaddr_in) : AF_INET6 == sa->sa_family ? sizeof(sockaddr_in6) : sizeof(sockaddr);
461}
462
463}} // namespace swoc::SWOC_VERSION_NS
An IPv4 address and host_order_port, modeled on an SRV type for DNS.
Definition IPSrv.h:20
An IPv6 address and host_order_port, modeled on an SRV type for DNS.
Definition IPSrv.h:123
An IP address and host_order_port, modeled on an SRV type for DNS.
Definition IPSrv.h:224
bool is_multicast(sockaddr const *sa)
bool is_private(sockaddr const *sa)
bool is_link_local(sockaddr const *sa)
For template deduction guides.
Definition ArenaWriter.cc:9
self_type & invalidate()
Invalidate this endpoint.
Definition IPEndpoint.h:299
self_type & operator=(self_type const &that)
Copy assignment.
Definition IPEndpoint.h:315
swoc::MemSpan< void const > raw_addr() const
Definition IPEndpoint.h:417
bool parse(string_view const &str)
Definition swoc_ip.cc:205
socklen_t size() const
Definition swoc_ip.cc:214
struct sockaddr_in sa4
IPv4.
Definition IPEndpoint.h:41
bool is_private() const
Definition IPEndpoint.h:435
bool is_ip6() const
Test for IPv6.
Definition IPEndpoint.h:350
static in_port_t & port(sockaddr *sa)
Definition IPEndpoint.h:395
self_type & set_to_loopback(int family)
Definition swoc_ip.cc:270
in_port_t network_order_port() const
Definition IPEndpoint.h:380
IPEndpoint(sockaddr_in const *sin)
Construct from sockaddr_in.
self_type & set_to_any(int family)
Definition swoc_ip.cc:241
bool is_any() const
Definition swoc_ip.cc:256
sockaddr_in * ip4()
Definition IPEndpoint.h:360
IPEndpoint(sockaddr_in6 const *sin6)
Construct from sockaddr_in6.
static bool tokenize(string_view src, string_view *host=nullptr, string_view *port=nullptr, string_view *rest=nullptr)
Definition swoc_ip.cc:147
static bool assign(sockaddr *dst, sockaddr const *src)
Definition swoc_ip.cc:50
bool is_link_local() const
Definition IPEndpoint.h:427
static void invalidate(sockaddr *addr)
Invalidate a sockaddr.
Definition IPEndpoint.h:305
sa_family_t family() const
Definition IPEndpoint.h:355
bool is_loopback() const
Definition swoc_ip.cc:285
const self_type & copy_to(sockaddr *addr) const
Copy to sa.
Definition IPEndpoint.h:339
IPEndpoint self_type
Self reference type.
Definition IPEndpoint.h:37
bool is_ip4() const
Test for IPv4.
Definition IPEndpoint.h:345
bool is_multicast() const
Definition IPEndpoint.h:443
struct sockaddr sa
Generic address.
Definition IPEndpoint.h:40
size_t sa_size() const
Size of the sockaddr variant based on the family.
Definition IPEndpoint.h:455
static string_view family_name(sa_family_t family)
The string name of the address family.
Definition swoc_ip.cc:226
struct sockaddr_in6 sa6
IPv6.
Definition IPEndpoint.h:42
IPEndpoint()
Default construct invalid instance.
Definition IPEndpoint.h:280
sockaddr_in6 * ip6()
Definition IPEndpoint.h:370
bool is_valid() const
Test for valid IP address.
Definition IPEndpoint.h:310
in_port_t host_order_port() const
Definition IPEndpoint.h:385