Отправить данные XML по UDP

Я пишу программу, которая при вводе отправляет сообщение с некоторыми данными. Я хочу иметь возможность отправлять сообщение 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-сообщения. Это зависит от вас, чтобы убедиться, что ваш пакет достаточно мал, чтобы он не был разбит маршрутизацией на пути к месту назначения.

2

Решение

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();
1

Другие решения


По вопросам рекламы [email protected]