17 #include <QNetworkInterface>
21 if (address.protocol() == QAbstractSocket::IPv4Protocol) {
22 return address.isInSubnet(QHostAddress(QLatin1String(
"224.0.0.0")), 4);
23 }
else if (address.protocol() == QAbstractSocket::IPv6Protocol) {
24 return address.isInSubnet(QHostAddress(QLatin1String(
"ff00::")), 8);
34 d->socketIPv4 =
new QUdpSocket(
this);
36 d->socketIPv6 =
new QUdpSocket(
this);
48 const QHostAddress AnyIPv4(QLatin1String(
"0.0.0.0"));
53 rc = d->socketIPv4->bind(AnyIPv4, port, mode) && rc;
54 rc = d->socketIPv6->bind(QHostAddress::AnyIPv6, port, mode) && rc;
61 d->soapVersion = version;
69 const QByteArray data = msgWriter.
messageToXml(message, QString(), headers, QMap<QString, KDSoapMessage>());
72 bool anySuccess =
false;
73 const auto &allInterfaces = QNetworkInterface::allInterfaces();
74 for (
const auto &iface : allInterfaces) {
75 if (iface.flags().testFlag(QNetworkInterface::IsUp) && iface.flags().testFlag(QNetworkInterface::CanMulticast)) {
77 if (address.protocol() == QAbstractSocket::IPv4Protocol) {
78 d->socketIPv4->setMulticastInterface(iface);
79 qint64 writtenSize = d->socketIPv4->writeDatagram(data, address, port);
80 anySuccess = anySuccess || (writtenSize == data.size());
81 }
else if (address.protocol() == QAbstractSocket::IPv6Protocol) {
82 d->socketIPv6->setMulticastInterface(iface);
83 qint64 writtenSize = d->socketIPv6->writeDatagram(data, address, port);
84 anySuccess = anySuccess || (writtenSize == data.size());
91 if (address.protocol() == QAbstractSocket::IPv4Protocol) {
92 qint64 writtenSize = d->socketIPv4->writeDatagram(data, address, port);
93 return writtenSize == data.size();
94 }
else if (address.protocol() == QAbstractSocket::IPv6Protocol) {
95 qint64 writtenSize = d->socketIPv6->writeDatagram(data, address, port);
96 return writtenSize == data.size();
104 QUdpSocket *socket = qobject_cast<QUdpSocket *>(sender());
105 while (socket->hasPendingDatagrams()) {
106 qint64 size = socket->pendingDatagramSize();
110 QHostAddress senderAddress;
112 socket->readDatagram(buffer.data(), buffer.size(), &senderAddress, &senderPort);
129 emit q->receivedMessage(replyMessage, replyHeaders, senderAddress, senderPort);
static bool isMulticastAddress(const QHostAddress &address)
XmlError xmlToMessage(const QByteArray &data, KDSoapMessage *pParsedMessage, QString *pMessageNamespace, KDSoapHeaders *pRequestHeaders, KDSoap::SoapVersion soapVersion) const
QByteArray messageToXml(const KDSoapMessage &message, const QString &method, const KDSoapHeaders &headers, const QMap< QString, KDSoapMessage > &persistentHeaders, const KDSoapAuthentication &authentication=KDSoapAuthentication()) const
void setVersion(KDSoap::SoapVersion version)
KDSoap::SoapVersion soapVersion
void receivedDatagram(const QByteArray &messageData, const QHostAddress &senderAddress, quint16 senderPort)
KDSoapUdpClient provides an interface for implementing a SOAP-over-UDP client.
void setSoapVersion(KDSoap::SoapVersion version)
bool bind(quint16 port=0, QAbstractSocket::BindMode mode=QAbstractSocket::DefaultForPlatform)
bool sendMessage(const KDSoapMessage &message, const KDSoapHeaders &headers, const QHostAddress &address, quint16 port)
KDSoapUdpClient(QObject *parent=nullptr)