Я пишу программу, которая при вводе отправляет сообщение с некоторыми данными. Я хочу иметь возможность отправлять сообщение udp по многоадресной рассылке, и я хочу иметь возможность отправлять это сообщение в формате xml. В настоящее время моя программа написана на qt, и, если возможно, я бы хотел сохранить ее на qt.
Из документации я могу создавать и отправлять данные с помощью сокета udp следующим образом:
udpSocket = new QUdpSocket(this);
QByteArray datagram = "stuff here";
udpSocket->writeDatagram(datagram.data(), datagram.size(), groupAddress, port)
где адрес группы — это IP-адрес, на который я отправляю сообщение, а порт — это порт, на который я отправляю сообщение.
с другой стороны, я могу использовать:
QXmlStreamWriter xml;
xml.setDevice(QIODevice);
для отправки данных XML, и QIODevice может либо отправлять данные в файл, либо отправлять данные по TCP, и форматировать все данные в форме XML.
Однако я не могу найти способ установить udpSocket в качестве устройства для QXmlStreamWriter и установить для автоматической отправки этих данных, когда они передаются таким образом. Есть ли способ сделать это? Или мне придется отформатировать все в байтовом массиве, чтобы отправить его?
Изменить: В случае, если кто-то другой натыкается на это в поисках информации.
Метод, описанный Nejat (указан в качестве ответа), действительно отправляет данные XML по UDP. Однако QXmlStreamWriter заканчивает тем, что отправляет очень большое количество пакетов, что не очень полезно, если вы пытаетесь отправить один отформатированный блок xml. Если вам нужно отправить отформатированный блок xml, вам нужно сделать следующее:
Шаг 1: создайте свой сокет udp
udpSocket = new QUdpSocket(this);
Шаг 2: создайте QByteArray и установите его как «устройство», в которое записывает QXmlStreamWriter.
QByteArray message;
QXmlStreamWriter xml(&message);
//proceed to write the xml like you would normally
Шаг 3: отправьте ваше сообщение QByteArray, как указано в документации.
udpSocket->writeDatagram(message.data(), message.size(), groupAddress, port);
Делая это таким образом, вы создадите один большой пакет, а затем отправите его через UDP-сообщения. Это зависит от вас, чтобы убедиться, что ваш пакет достаточно мал, чтобы он не был разбит маршрутизацией на пути к месту назначения.
QUdpSocket
наследуется от QAbstractSocket
который также наследует от QIODevice
, Так что вы можете передать QUdpSocket
к QXmlStreamWriter
конструктор. Это позволит вам писать на устройство через поток.
Из документации о QUdpSocket
:
Если вы хотите использовать стандартные функции QIODevice read (),
readLine (), write () и т. д., вы должны сначала подключить сокет напрямую
на одноранговый узел, вызывая connectToHost ().
Итак, вы должны сначала подключиться к пиру:
udpSocket = new QUdpSocket(this);
udpSocket->connectToHost(ip, port);
udpSocket->waitForConnected(1000);
QXmlStreamWriter xml(udpSocket);
xml.setAutoFormatting(true);
xml.writeStartDocument();
...
xml.writeStartElement("bookmark");
xml.writeTextElement("title", "Some Text");
xml.writeEndElement();
...
xml.writeEndDocument();