libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
networkaddress.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
13#include <variant>
14#include <promeki/datatype.h>
15#include <promeki/namespace.h>
16#include <promeki/string.h>
17#include <promeki/result.h>
18#include <promeki/platform.h>
19#include <promeki/ipv4address.h>
20#include <promeki/ipv6address.h>
21
22#if defined(PROMEKI_PLATFORM_WINDOWS)
23#include <winsock2.h>
24#include <ws2tcpip.h>
25#elif !defined(PROMEKI_PLATFORM_EMSCRIPTEN)
26#include <sys/socket.h>
27#include <netinet/in.h>
28#endif
29
30PROMEKI_NAMESPACE_BEGIN
31
32class TextStream;
33class DataStream;
34
71class NetworkAddress {
72 public:
73 PROMEKI_DATATYPE(NetworkAddress, DataTypeNetworkAddress, 1)
74
75
76 Error writeToStream(DataStream &s) const;
78 template <uint32_t V> static Result<NetworkAddress> readFromStream(DataStream &s);
79
81 enum Type {
82 None = 0,
83 IPv4,
84 IPv6,
85 Hostname
86 };
87
98 static Result<NetworkAddress> fromString(const String &str);
99
100#if !defined(PROMEKI_PLATFORM_EMSCRIPTEN)
113 static Result<NetworkAddress> fromSockAddr(const struct sockaddr *addr, size_t len);
114#endif
115
117 NetworkAddress() = default;
118
123 NetworkAddress(const Ipv4Address &addr) : _data(addr) {}
124
129 NetworkAddress(const Ipv6Address &addr) : _data(addr) {}
130
135 explicit NetworkAddress(const String &hostname) : _data(hostname) {}
136
138 Type type() const;
139
141 bool isNull() const { return std::holds_alternative<std::monostate>(_data); }
142
144 bool isIPv4() const { return std::holds_alternative<Ipv4Address>(_data); }
145
147 bool isIPv6() const { return std::holds_alternative<Ipv6Address>(_data); }
148
150 bool isHostname() const { return std::holds_alternative<String>(_data); }
151
153 bool isResolved() const { return isIPv4() || isIPv6(); }
154
159 Ipv4Address toIpv4() const;
160
165 Ipv6Address toIpv6() const;
166
171 String hostname() const;
172
178 bool isLoopback() const;
179
186 bool isMulticast() const;
187
194 bool isLinkLocal() const;
195
203 String toString() const;
204
205#if !defined(PROMEKI_PLATFORM_EMSCRIPTEN)
218 size_t toSockAddr(struct sockaddr_storage *storage) const;
219
221 enum FamilyPreference {
222 PreferIPv4,
223 PreferIPv6,
224 AnyFamily
225 };
226
248 Result<NetworkAddress> resolve(FamilyPreference prefer = PreferIPv4) const;
249#endif
250
252 bool operator==(const NetworkAddress &other) const { return _data == other._data; }
254 bool operator!=(const NetworkAddress &other) const { return _data != other._data; }
255
256 private:
257 std::variant<std::monostate, Ipv4Address, Ipv6Address, String> _data;
258};
259
261TextStream &operator<<(TextStream &stream, const NetworkAddress &addr);
262
263PROMEKI_NAMESPACE_END
264
265PROMEKI_FORMAT_VIA_TOSTRING(promeki::NetworkAddress);
266
267#endif // PROMEKI_ENABLE_CORE