11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
21#if defined(PROMEKI_PLATFORM_WINDOWS)
24#elif !defined(PROMEKI_PLATFORM_EMSCRIPTEN)
25#include <sys/socket.h>
26#include <netinet/in.h>
29PROMEKI_NAMESPACE_BEGIN
89 static Result<NetworkAddress> fromString(
const String &str);
91#if !defined(PROMEKI_PLATFORM_EMSCRIPTEN)
104 static Result<NetworkAddress> fromSockAddr(
const struct sockaddr *addr,
size_t len);
108 NetworkAddress() =
default;
114 NetworkAddress(
const Ipv4Address &addr) : _data(addr) {}
120 NetworkAddress(
const Ipv6Address &addr) : _data(addr) {}
126 explicit NetworkAddress(
const String &hostname) : _data(hostname) {}
132 bool isNull()
const {
return std::holds_alternative<std::monostate>(_data); }
135 bool isIPv4()
const {
return std::holds_alternative<Ipv4Address>(_data); }
138 bool isIPv6()
const {
return std::holds_alternative<Ipv6Address>(_data); }
141 bool isHostname()
const {
return std::holds_alternative<String>(_data); }
144 bool isResolved()
const {
return isIPv4() || isIPv6(); }
150 Ipv4Address toIpv4()
const;
156 Ipv6Address toIpv6()
const;
162 String hostname()
const;
169 bool isLoopback()
const;
177 bool isMulticast()
const;
185 bool isLinkLocal()
const;
194 String toString()
const;
196#if !defined(PROMEKI_PLATFORM_EMSCRIPTEN)
209 size_t toSockAddr(
struct sockaddr_storage *storage)
const;
213 bool operator==(
const NetworkAddress &other)
const {
return _data == other._data; }
215 bool operator!=(
const NetworkAddress &other)
const {
return _data != other._data; }
218 std::variant<std::monostate, Ipv4Address, Ipv6Address, String> _data;
222TextStream &operator<<(TextStream &stream,
const NetworkAddress &addr);
226PROMEKI_FORMAT_VIA_TOSTRING(promeki::NetworkAddress);