Как я могу отправлять и получать пакеты UDP в QT - PullRequest
9 голосов
/ 29 июня 2011

Я пишу небольшое приложение в QT, которое отправляет широковещательный пакет UDP по локальной сети и ожидает ответного пакета UDP от одного или нескольких устройств по сети.

Создание сокетов и отправка широковещательного пакета.

udpSocketSend = new QUdpSocket(this);
udpSocketGet  = new QUdpSocket(this);
bcast = new QHostAddress("192.168.1.255");

udpSocketSend->connectToHost(*bcast,65001,QIODevice::ReadWrite);
udpSocketGet->bind(udpSocketSend->localPort());
connect(udpSocketGet,SIGNAL(readyRead()),this,SLOT(readPendingDatagrams()));

QByteArray *datagram = makeNewDatagram(); // data from external function
udpSocketSend->write(*datagram);

Приложение отправляет пакет правильно, и ответный пакет приходит, но функция readPendingDatagrams() никогда не вызывается. Я проверил, что пакеты отправляются и принимаются с помощью Wireshark и что приложение прослушивает порт, указанный в wireshark, с помощью Process Explorer.

Ответы [ 2 ]

8 голосов
/ 01 июля 2011

Я решил проблему. Вот решение.

udpSocketSend = new QUdpSocket(this);
udpSocketGet  = new QUdpSocket(this);
host  = new QHostAddress("192.168.1.101");
bcast = new QHostAddress("192.168.1.255");

udpSocketSend->connectToHost(*bcast,65001);
udpSocketGet->bind(*host, udpSocketSend->localPort());
connect(udpSocketGet,SIGNAL(readyRead()),this,SLOT(readPendingDatagrams()));

QByteArray *datagram = makeNewDatagram(); // data from external function
udpSocketSend->write(*datagram);

Устройство в сети прослушивает порт 65001 и отвечает на пакеты на порту источника полученного пакета. Необходимо использовать connectToHost(...), чтобы знать, какой порт связать для пакета ответа.

Также необходимо привязать к правильному адресу и порту для получения пакетов. Это была проблема.

1 голос
/ 29 июня 2011

Вы связываете свой udpSocketSend в режиме QIODevice::ReadWrite. Так что это объект, который будет получать дейтаграммы.

Попробуйте один из:

  • привязка отправляющего сокета в режиме только записи, а принимающего - в режиме только приема
  • использование одного и того же сокета для обеих целей (полностью удалить udpSocketGet).

в зависимости от ваших ограничений.

...