libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
socketaddress.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 <cstdint>
14#include <promeki/namespace.h>
15#include <promeki/string.h>
16#include <promeki/result.h>
17#include <promeki/platform.h>
19#include <promeki/datatype.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;
32class DataStream;
33
57class SocketAddress {
58 public:
59 PROMEKI_DATATYPE(SocketAddress, DataTypeSocketAddress, 1)
60
61
62 Error writeToStream(DataStream &s) const;
64 template <uint32_t V> static Result<SocketAddress> readFromStream(DataStream &s);
65
78 static Result<SocketAddress> fromString(const String &hostPort);
79
85 static SocketAddress any(uint16_t port) { return SocketAddress(Ipv4Address::any(), port); }
86
92 static SocketAddress localhost(uint16_t port) { return SocketAddress(Ipv4Address::loopback(), port); }
93
95 SocketAddress() = default;
96
102 SocketAddress(const NetworkAddress &address, uint16_t port) : _address(address), _port(port) {}
103
109 SocketAddress(const Ipv4Address &addr, uint16_t port) : _address(addr), _port(port) {}
110
116 SocketAddress(const Ipv6Address &addr, uint16_t port) : _address(addr), _port(port) {}
117
119 const NetworkAddress &address() const { return _address; }
120
122 void setAddress(const NetworkAddress &address) { _address = address; }
123
125 uint16_t port() const { return _port; }
126
128 void setPort(uint16_t port) { _port = port; }
129
131 bool isNull() const { return _address.isNull() && _port == 0; }
132
134 bool isIPv4() const { return _address.isIPv4(); }
135
137 bool isIPv6() const { return _address.isIPv6(); }
138
140 bool isLoopback() const { return _address.isLoopback(); }
141
143 bool isMulticast() const { return _address.isMulticast(); }
144
151 String toString() const;
152
153#if !defined(PROMEKI_PLATFORM_EMSCRIPTEN)
161 static Result<SocketAddress> fromSockAddr(const struct sockaddr *addr, size_t len);
162
168 size_t toSockAddr(struct sockaddr_storage *storage) const;
169#endif
170
172 bool operator==(const SocketAddress &other) const {
173 return _address == other._address && _port == other._port;
174 }
175
177 bool operator!=(const SocketAddress &other) const { return !(*this == other); }
178
179 private:
180 NetworkAddress _address;
181 uint16_t _port = 0;
182};
183
185TextStream &operator<<(TextStream &stream, const SocketAddress &addr);
186
187PROMEKI_NAMESPACE_END
188
189PROMEKI_FORMAT_VIA_TOSTRING(promeki::SocketAddress);
190
191#endif // PROMEKI_ENABLE_CORE