15#include "libmythbase/mythconfig.h"
20# define GET_SOCKET_ERROR WSAGetLastError()
22# include <sys/socket.h>
23# include <netinet/in.h>
24# include <arpa/inet.h>
25# define GET_SOCKET_ERROR errno
38#define LOC QString("MMulticastSocketDevice(%1:%2): ") \
39 .arg(m_address.toString()).arg(socket())
42 const QString& sAddress, quint16 nPort, u_char ttl) :
43 MSocketDevice(MSocketDevice::Datagram),
44 m_address(sAddress), m_port(nPort)
54 setSocket(createNewSocket(), MSocketDevice::Datagram);
56 m_imr.imr_multiaddr.s_addr = inet_addr(sAddress.toLatin1().constData());
57 m_imr.imr_interface.s_addr = htonl(INADDR_ANY);
59 if (setsockopt(socket(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
62 LOG(VB_GENERAL, LOG_ERR,
LOC +
"setsockopt - IP_ADD_MEMBERSHIP " +
ENO);
65 if (setsockopt(socket(), IPPROTO_IP, IP_MULTICAST_TTL,
66 (
const char *)&ttl,
sizeof(ttl)) < 0)
68 LOG(VB_GENERAL, LOG_ERR,
LOC +
"setsockopt - IP_MULTICAST_TTL " +
ENO);
71 setAddressReusable(
true);
74 LOG(VB_GENERAL, LOG_ERR,
LOC +
"bind failed");
80 (setsockopt(socket(), IPPROTO_IP, IP_DROP_MEMBERSHIP,
85 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
"setsockopt - IP_DROP_MEMBERSHIP " +
91 const char *data, quint64 len,
92 const QHostAddress & host, quint16 port)
95 if (host.toString() ==
"239.255.255.250")
100 if (
address.protocol() != QAbstractSocket::IPv4Protocol)
103 QString addr =
address.toString();
104 if (addr ==
"127.0.0.1")
107 uint32_t interface_addr =
address.toIPv4Address();
108 if (setsockopt(socket(), IPPROTO_IP, IP_MULTICAST_IF,
109 (
const char *)&interface_addr,
110 sizeof(interface_addr)) < 0)
112 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
113 "setsockopt - IP_MULTICAST_IF " +
ENO);
115 retx = MSocketDevice::writeBlock(data, len, host,
port);
117 LOG(VB_GENERAL, LOG_DEBUG,
LOC + QString(
"writeBlock on %1 %2")
118 .arg((*it).toString()).arg((retx==(
int)len)?
"ok":
"err"));
120 std::this_thread::sleep_for(std::chrono::milliseconds(
MythRandom(5, 9)));
126 return MSocketDevice::writeBlock(data, len, host,
port);
~MMulticastSocketDevice() override
QList< QHostAddress > m_localAddresses
QHostAddress address() const override
qint64 writeBlock(const char *data, quint64 len, const QHostAddress &host, quint16 port) override
quint16 port() const override
QString GetValue(const QString &setting)
#define ENO
This can be appended to the LOG args with "+".
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Convenience inline random number generator functions.
uint32_t MythRandom()
generate 32 random bits