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/namespace.h>
15#include <promeki/string.h>
16#include <promeki/result.h>
17#include <promeki/platform.h>
18#include <promeki/ipv4address.h>
19#include <promeki/ipv6address.h>
20
21#if defined(PROMEKI_PLATFORM_WINDOWS)
22#include <winsock2.h>
23#include <ws2tcpip.h>
24#elif !defined(PROMEKI_PLATFORM_EMSCRIPTEN)
25#include <sys/socket.h>
26#include <netinet/in.h>
27#endif
28
29PROMEKI_NAMESPACE_BEGIN
30
31class TextStream;
32
69class NetworkAddress {
70 public:
72 enum Type {
73 None = 0,
74 IPv4,
75 IPv6,
76 Hostname
77 };
78
89 static Result<NetworkAddress> fromString(const String &str);
90
91#if !defined(PROMEKI_PLATFORM_EMSCRIPTEN)
104 static Result<NetworkAddress> fromSockAddr(const struct sockaddr *addr, size_t len);
105#endif
106
108 NetworkAddress() = default;
109
114 NetworkAddress(const Ipv4Address &addr) : _data(addr) {}
115
120 NetworkAddress(const Ipv6Address &addr) : _data(addr) {}
121
126 explicit NetworkAddress(const String &hostname) : _data(hostname) {}
127
129 Type type() const;
130
132 bool isNull() const { return std::holds_alternative<std::monostate>(_data); }
133
135 bool isIPv4() const { return std::holds_alternative<Ipv4Address>(_data); }
136
138 bool isIPv6() const { return std::holds_alternative<Ipv6Address>(_data); }
139
141 bool isHostname() const { return std::holds_alternative<String>(_data); }
142
144 bool isResolved() const { return isIPv4() || isIPv6(); }
145
150 Ipv4Address toIpv4() const;
151
156 Ipv6Address toIpv6() const;
157
162 String hostname() const;
163
169 bool isLoopback() const;
170
177 bool isMulticast() const;
178
185 bool isLinkLocal() const;
186
194 String toString() const;
195
196#if !defined(PROMEKI_PLATFORM_EMSCRIPTEN)
209 size_t toSockAddr(struct sockaddr_storage *storage) const;
210#endif
211
213 bool operator==(const NetworkAddress &other) const { return _data == other._data; }
215 bool operator!=(const NetworkAddress &other) const { return _data != other._data; }
216
217 private:
218 std::variant<std::monostate, Ipv4Address, Ipv6Address, String> _data;
219};
220
222TextStream &operator<<(TextStream &stream, const NetworkAddress &addr);
223
224PROMEKI_NAMESPACE_END
225
226PROMEKI_FORMAT_VIA_TOSTRING(promeki::NetworkAddress);
227
228#endif // PROMEKI_ENABLE_CORE