Stroika Library 3.0d25
 
Loading...
Searching...
No Matches
SocketAddress.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2026. 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 fSocketAddress_V4_.sin_port = htons (portNumber); //NB no '::' cuz some systems use macro
39 fSocketAddress_V4_.sin_addr = iaddr.As<in_addr> ();
40 } break;
41 case InternetAddress::AddressFamily::V6: {
42 fSocketAddress_V6_ = sockaddr_in6{};
43 fSocketAddress_V6_.sin6_family = AF_INET6;
44 fSocketAddress_V6_.sin6_port = htons (portNumber); //NB no ':' cuz some systems use macro
45 fSocketAddress_V6_.sin6_addr = iaddr.As<in6_addr> ();
46 } break;
47 default: {
48 // just leave blank - no assert?
49 fSocketAddress_ = sockaddr{};
50 } break;
51 }
52 }
53 inline bool SocketAddress::empty () const
54 {
55 return fSocketAddress_.sa_family == AF_UNSPEC;
56 }
57 inline void SocketAddress::clear ()
58 {
59 fSocketAddress_ = sockaddr{};
60 Assert (fSocketAddress_.sa_family == AF_UNSPEC);
61 }
63 {
64 return static_cast<FamilyType> (fSocketAddress_.sa_family);
65 }
66 inline size_t SocketAddress::GetRequiredSize () const
67 {
68 switch (fSocketAddress_.sa_family) {
69 case AF_INET: {
70 return sizeof (fSocketAddress_V4_);
71 }
72 case AF_INET6: {
73 return sizeof (fSocketAddress_V6_);
74 }
75 /*case AF_UNIX:
76 @todo something like this - add to variant union - but didn't compile on windoze...
77 return sizeof (sockaddr_un);*/
78 default: {
79 return sizeof (fSocketAddressStorage_);
80 }
81 }
82 }
84 {
85 return fSocketAddress_.sa_family == AF_INET or fSocketAddress_.sa_family == AF_INET6;
86 }
88 {
89 Require (IsInternetAddress ());
90 switch (fSocketAddress_.sa_family) {
91 case AF_INET: {
92 return InternetAddress{fSocketAddress_V4_.sin_addr};
93 }
94 case AF_INET6: {
95 return InternetAddress{fSocketAddress_V6_.sin6_addr};
96 }
97 default: {
99 return InternetAddress{};
100 }
101 }
102 }
103 inline PortType SocketAddress::GetPort () const
104 {
105 Require (IsInternetAddress ());
106 switch (fSocketAddress_.sa_family) {
107 case AF_INET: {
108 return ntohs (fSocketAddress_V4_.sin_port); //NB no ':' cuz some systems use macro
109 }
110 case AF_INET6: {
111 return ntohs (fSocketAddress_V6_.sin6_port); //NB no ':' cuz some systems use macro
112 }
113 default: {
115 return 0;
116 }
117 }
118 }
119 template <>
120 inline sockaddr SocketAddress::As<sockaddr> () const
121 {
122 Require (fSocketAddress_.sa_family == AF_INET or fSocketAddress_.sa_family == AF_UNSPEC); // You probably meant to use sockaddr_storage (to support IPv6)
123 return fSocketAddress_;
124 }
125 template <>
126 inline sockaddr_storage SocketAddress::As<sockaddr_storage> () const
127 {
128 return fSocketAddressStorage_;
129 }
130 template <>
131 inline sockaddr_in SocketAddress::As<sockaddr_in> () const
132 {
133 Require (fSocketAddress_.sa_family == AF_INET or fSocketAddress_.sa_family == AF_UNSPEC);
134 return fSocketAddress_V4_;
135 }
136 template <>
137 inline sockaddr_in6 SocketAddress::As<sockaddr_in6> () const
138 {
139 Require (fSocketAddress_.sa_family == AF_INET6 or fSocketAddress_.sa_family == AF_UNSPEC);
140 return fSocketAddress_V6_;
141 }
142
143 /*
144 ********************************************************************************
145 *************************** IO::Network::LocalHost *****************************
146 ********************************************************************************
147 */
149 {
150 Require (fm == SocketAddress::INET or fm == SocketAddress::INET6);
151 if (fm == SocketAddress::INET) {
152 return V4::kLocalhost;
153 }
154 if (fm == SocketAddress::INET6) {
155 return V6::kLocalhost;
156 }
157 return V4::kLocalhost;
158 }
159
160}
#define AssertNotReached()
Definition Assertions.h:358
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