Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
SocketAddress.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4
6
7 /*
8 ********************************************************************************
9 *********************** IO::Network::SocketAddress *****************************
10 ********************************************************************************
11 */
12 constexpr inline SocketAddress::SocketAddress () noexcept
13 : fSocketAddress_{}
14 {
15 }
16 constexpr inline SocketAddress::SocketAddress (const sockaddr& iaddr) noexcept
17 : fSocketAddress_{iaddr}
18 {
19 }
20 constexpr inline SocketAddress::SocketAddress (const sockaddr_in& iaddr) noexcept
21 : fSocketAddress_V4_{iaddr}
22 {
23 }
24 constexpr inline SocketAddress::SocketAddress (const sockaddr_in6& iaddr) noexcept
25 : fSocketAddress_V6_{iaddr}
26 {
27 }
28 constexpr inline SocketAddress::SocketAddress (const sockaddr_storage& iaddr) noexcept
29 : fSocketAddressStorage_{iaddr}
30 {
31 }
32 inline SocketAddress::SocketAddress (const InternetAddress& iaddr, PortType portNumber)
33 {
34 switch (iaddr.GetAddressFamily ()) {
35 case InternetAddress::AddressFamily::V4: {
36 fSocketAddress_V4_ = sockaddr_in{};
37 fSocketAddress_V4_.sin_family = AF_INET;
38 DISABLE_COMPILER_CLANG_WARNING_START ("clang diagnostic ignored \"-Wdeprecated\""); // macro uses 'register' - htons not deprecated
39 fSocketAddress_V4_.sin_port = htons (portNumber); //NB no '::' cuz some systems use macro
40 DISABLE_COMPILER_CLANG_WARNING_END ("clang diagnostic ignored \"-Wdeprecated\"");
41 fSocketAddress_V4_.sin_addr = iaddr.As<in_addr> ();
42 } break;
43 case InternetAddress::AddressFamily::V6: {
44 fSocketAddress_V6_ = sockaddr_in6{};
45 fSocketAddress_V6_.sin6_family = AF_INET6;
46 DISABLE_COMPILER_CLANG_WARNING_START ("clang diagnostic ignored \"-Wdeprecated\""); // macro uses 'register' - htons not deprecated
47 fSocketAddress_V6_.sin6_port = htons (portNumber); //NB no ':' cuz some systems use macro
48 DISABLE_COMPILER_CLANG_WARNING_END ("clang diagnostic ignored \"-Wdeprecated\"");
49 fSocketAddress_V6_.sin6_addr = iaddr.As<in6_addr> ();
50 } break;
51 default: {
52 // just leave blank - no assert?
53 fSocketAddress_ = sockaddr{};
54 } break;
55 }
56 }
57 inline bool SocketAddress::empty () const
58 {
59 return fSocketAddress_.sa_family == AF_UNSPEC;
60 }
61 inline void SocketAddress::clear ()
62 {
63 fSocketAddress_ = sockaddr{};
64 Assert (fSocketAddress_.sa_family == AF_UNSPEC);
65 }
67 {
68 return static_cast<FamilyType> (fSocketAddress_.sa_family);
69 }
70 inline size_t SocketAddress::GetRequiredSize () const
71 {
72 switch (fSocketAddress_.sa_family) {
73 case AF_INET: {
74 return sizeof (fSocketAddress_V4_);
75 }
76 case AF_INET6: {
77 return sizeof (fSocketAddress_V6_);
78 }
79 /*case AF_UNIX:
80 @todo something like this - add to variant union - but didn't compile on windoze...
81 return sizeof (sockaddr_un);*/
82 default: {
83 return sizeof (fSocketAddressStorage_);
84 }
85 }
86 }
88 {
89 return fSocketAddress_.sa_family == AF_INET or fSocketAddress_.sa_family == AF_INET6;
90 }
92 {
93 Require (IsInternetAddress ());
94 switch (fSocketAddress_.sa_family) {
95 case AF_INET: {
96 return InternetAddress{fSocketAddress_V4_.sin_addr};
97 }
98 case AF_INET6: {
99 return InternetAddress{fSocketAddress_V6_.sin6_addr};
100 }
101 default: {
103 return InternetAddress{};
104 }
105 }
106 }
107 inline PortType SocketAddress::GetPort () const
108 {
109 Require (IsInternetAddress ());
110 switch (fSocketAddress_.sa_family) {
111 case AF_INET: {
112 DISABLE_COMPILER_CLANG_WARNING_START ("clang diagnostic ignored \"-Wdeprecated\""); // macro uses 'register' - htons not deprecated
113 return ntohs (fSocketAddress_V4_.sin_port); //NB no ':' cuz some systems use macro
114 DISABLE_COMPILER_CLANG_WARNING_END ("clang diagnostic ignored \"-Wdeprecated\""); // macro uses 'register' - htons not deprecated
115 }
116 case AF_INET6: {
117 DISABLE_COMPILER_CLANG_WARNING_START ("clang diagnostic ignored \"-Wdeprecated\""); // macro uses 'register' - htons not deprecated
118 return ntohs (fSocketAddress_V6_.sin6_port); //NB no ':' cuz some systems use macro
119 DISABLE_COMPILER_CLANG_WARNING_END ("clang diagnostic ignored \"-Wdeprecated\""); // macro uses 'register' - htons not deprecated
120 }
121 default: {
123 return 0;
124 }
125 }
126 }
127 template <>
128 inline sockaddr SocketAddress::As<sockaddr> () const
129 {
130 Require (fSocketAddress_.sa_family == AF_INET or fSocketAddress_.sa_family == AF_UNSPEC); // You probably meant to use sockaddr_storage (to support IPv6)
131 return fSocketAddress_;
132 }
133 template <>
134 inline sockaddr_storage SocketAddress::As<sockaddr_storage> () const
135 {
136 return fSocketAddressStorage_;
137 }
138 template <>
139 inline sockaddr_in SocketAddress::As<sockaddr_in> () const
140 {
141 Require (fSocketAddress_.sa_family == AF_INET or fSocketAddress_.sa_family == AF_UNSPEC);
142 return fSocketAddress_V4_;
143 }
144 template <>
145 inline sockaddr_in6 SocketAddress::As<sockaddr_in6> () const
146 {
147 Require (fSocketAddress_.sa_family == AF_INET6 or fSocketAddress_.sa_family == AF_UNSPEC);
148 return fSocketAddress_V6_;
149 }
150
151 /*
152 ********************************************************************************
153 *************************** IO::Network::LocalHost *****************************
154 ********************************************************************************
155 */
157 {
158 Require (fm == SocketAddress::INET or fm == SocketAddress::INET6);
159 if (fm == SocketAddress::INET) {
160 return V4::kLocalhost;
161 }
162 if (fm == SocketAddress::INET6) {
163 return V6::kLocalhost;
164 }
165 return V4::kLocalhost;
166 }
167
168}
#define AssertNotReached()
Definition Assertions.h:355
nonvirtual InternetAddress GetInternetAddress() const
FamilyType
Socket address family - also sometimes referred to as domain (argument to ::socket calls it domain)
nonvirtual FamilyType GetAddressFamily() const
constexpr InternetAddress LocalHost(SocketAddress::FamilyType fm)
return V4::kLocalhost or V6::kLocalhost depending on argument address family