11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
22#if defined(PROMEKI_PLATFORM_WINDOWS)
25#elif !defined(PROMEKI_PLATFORM_EMSCRIPTEN)
26#include <sys/socket.h>
27#include <netinet/in.h>
30PROMEKI_NAMESPACE_BEGIN
73 PROMEKI_DATATYPE(NetworkAddress, DataTypeNetworkAddress, 1)
76 Error writeToStream(DataStream &s) const;
78 template <uint32_t V> static Result<NetworkAddress> readFromStream(DataStream &s);
98 static Result<NetworkAddress> fromString(
const String &str);
100#if !defined(PROMEKI_PLATFORM_EMSCRIPTEN)
113 static Result<NetworkAddress> fromSockAddr(
const struct sockaddr *addr,
size_t len);
117 NetworkAddress() =
default;
123 NetworkAddress(
const Ipv4Address &addr) : _data(addr) {}
129 NetworkAddress(
const Ipv6Address &addr) : _data(addr) {}
135 explicit NetworkAddress(
const String &hostname) : _data(hostname) {}
141 bool isNull()
const {
return std::holds_alternative<std::monostate>(_data); }
144 bool isIPv4()
const {
return std::holds_alternative<Ipv4Address>(_data); }
147 bool isIPv6()
const {
return std::holds_alternative<Ipv6Address>(_data); }
150 bool isHostname()
const {
return std::holds_alternative<String>(_data); }
153 bool isResolved()
const {
return isIPv4() || isIPv6(); }
159 Ipv4Address toIpv4()
const;
165 Ipv6Address toIpv6()
const;
171 String hostname()
const;
178 bool isLoopback()
const;
186 bool isMulticast()
const;
194 bool isLinkLocal()
const;
203 String toString()
const;
205#if !defined(PROMEKI_PLATFORM_EMSCRIPTEN)
218 size_t toSockAddr(
struct sockaddr_storage *storage)
const;
221 enum FamilyPreference {
248 Result<NetworkAddress> resolve(FamilyPreference prefer = PreferIPv4)
const;
252 bool operator==(
const NetworkAddress &other)
const {
return _data == other._data; }
254 bool operator!=(
const NetworkAddress &other)
const {
return _data != other._data; }
257 std::variant<std::monostate, Ipv4Address, Ipv6Address, String> _data;
261TextStream &operator<<(TextStream &stream,
const NetworkAddress &addr);
265PROMEKI_FORMAT_VIA_TOSTRING(promeki::NetworkAddress);