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
59 PROMEKI_DATATYPE(SocketAddress, DataTypeSocketAddress, 1)
62 Error writeToStream(DataStream &s) const;
64 template <uint32_t V> static Result<SocketAddress> readFromStream(DataStream &s);
78 static Result<SocketAddress> fromString(const String &hostPort);
85 static SocketAddress any(uint16_t port) {
return SocketAddress(Ipv4Address::any(), port); }
92 static SocketAddress localhost(uint16_t port) {
return SocketAddress(Ipv4Address::loopback(), port); }
95 SocketAddress() =
default;
102 SocketAddress(
const NetworkAddress &address, uint16_t port) : _address(address), _port(port) {}
109 SocketAddress(
const Ipv4Address &addr, uint16_t port) : _address(addr), _port(port) {}
116 SocketAddress(
const Ipv6Address &addr, uint16_t port) : _address(addr), _port(port) {}
119 const NetworkAddress &address()
const {
return _address; }
122 void setAddress(
const NetworkAddress &address) { _address = address; }
125 uint16_t port()
const {
return _port; }
128 void setPort(uint16_t port) { _port = port; }
131 bool isNull()
const {
return _address.isNull() && _port == 0; }
134 bool isIPv4()
const {
return _address.isIPv4(); }
137 bool isIPv6()
const {
return _address.isIPv6(); }
140 bool isLoopback()
const {
return _address.isLoopback(); }
143 bool isMulticast()
const {
return _address.isMulticast(); }
151 String toString()
const;
153#if !defined(PROMEKI_PLATFORM_EMSCRIPTEN)
161 static Result<SocketAddress> fromSockAddr(
const struct sockaddr *addr,
size_t len);
168 size_t toSockAddr(
struct sockaddr_storage *storage)
const;
172 bool operator==(
const SocketAddress &other)
const {
173 return _address == other._address && _port == other._port;
177 bool operator!=(
const SocketAddress &other)
const {
return !(*
this == other); }
180 NetworkAddress _address;
185TextStream &operator<<(TextStream &stream,
const SocketAddress &addr);
189PROMEKI_FORMAT_VIA_TOSTRING(promeki::SocketAddress);