11#include <promeki/config.h>
12#if PROMEKI_ENABLE_NETWORK
25PROMEKI_NAMESPACE_BEGIN
104class MulticastReceiver :
public Thread {
105 PROMEKI_OBJECT(MulticastReceiver, Thread)
117 using DatagramCallback = Function<void(Buffer data,
const SocketAddress &sender)>;
131 SocketAddress source;
137 using GroupList = ::promeki::List<GroupEntry>;
140 static constexpr size_t DefaultMaxPacketSize = 2048;
143 static constexpr unsigned int DefaultReceiveTimeoutMs = 200;
149 MulticastReceiver(ObjectBase *parent =
nullptr);
152 ~MulticastReceiver()
override;
164 void setLocalAddress(
const SocketAddress &address);
167 const SocketAddress &localAddress()
const {
return _localAddress; }
178 void setInterface(
const String &iface);
181 const String &interfaceName()
const {
return _interfaceName; }
192 void setMaxPacketSize(
size_t bytes);
195 size_t maxPacketSize()
const {
return _maxPacketSize; }
209 void setReceiveTimeout(
unsigned int timeoutMs);
212 unsigned int receiveTimeout()
const {
return _receiveTimeoutMs; }
223 void setThreadName(
const String &name);
226 const String &threadName()
const {
return _threadName; }
236 void setDatagramCallback(DatagramCallback callback);
245 Error addGroup(
const SocketAddress &group);
255 Error addSourceGroup(
const SocketAddress &group,
const SocketAddress &source);
258 const GroupList &groups()
const {
return _groups; }
282 bool isActive()
const {
return _active.value(); }
295 UdpSocket *socket()
const {
return _socket.get(); }
306 uint64_t datagramCount()
const {
return _datagramCount.value(); }
312 uint64_t byteCount()
const {
return _byteCount.value(); }
324 PROMEKI_SIGNAL(datagramReceived, Buffer, SocketAddress);
327 PROMEKI_SIGNAL(receiveError, Error);
335 void closeAndLeave();
337 UdpSocket::UPtr _socket;
338 MulticastManager _multicastManager;
339 SocketAddress _localAddress;
340 String _interfaceName;
342 size_t _maxPacketSize = DefaultMaxPacketSize;
343 unsigned int _receiveTimeoutMs = DefaultReceiveTimeoutMs;
344 DatagramCallback _callback;
347 Atomic<bool> _active;
348 Atomic<bool> _stopRequested;
349 Atomic<uint64_t> _datagramCount;
350 Atomic<uint64_t> _byteCount;