QT QUdpSocket прием дейтаграммы broadcast

304
03 марта 2018, 20:34

В своей программе отправляю на устройство последовательность байт(68, 1, 0). Устройство отвечает последовательностью байт(68, 1, 0). Все это я вижу в программе WireShark. Но не могу принять пакет т.к. не происходит bind с адресом 192.168.0.255:1104. Кто может подсказать, как это сделать?
П.С. уже облазил весь QT ассистант, но ответа не нашел.
UPDATE новый код программы (это тестовый код, просто чтобы разобраться с работой с сокетами):

#include "UDP.h"
UDP_Manager::UDP_Manager()
{
    QHostAddress address("192.168.0.104");
    Udp_Socket = new QUdpSocket(this);
    bool Is_Bound = Udp_Socket->bind(QHostAddress::Any, 1104);
    QByteArray Data;
    Data.resize(3);
    Data[0] = 68;
    Data[1] = 1;
    Data[2] = 0;
    Udp_Socket->writeDatagram(Data, address, 1004);
    _sleep(500);
    char Buf[4];
    qint64 i = Udp_Socket->readDatagram(Buf, sizeof(Buf));
}

Скрин из программы WireShark:

Answer 1

Приём broadcast'а не отличается от приёма обычных сообщений, надо только за'bind'иться на локальные порт и адрес.

Ошибки в коде выше:

Во-первых, два сокета здесь не обязательны, вполне достаточно одного (если в дальнейшем на них не будет висеть какая-то различная логика). Сокет — это дуплексная абстракция.

Во-вторых, bind() всегда на локальный адрес (192.168.0.11 в данном случае), если нужно слушать все локальные интерфейсы, то следует привязываться к 0.0.0.0 (он же QHostAddress::Any).

В-третьих, проверка Udp_Socket_RX->state() свежесозданного сокета бессмысленна.

В итоге вся инициализация сильно схлопывается:

QHostAddress address("192.168.0.104");
Udp_Socket = new QUdpSocket(this);
Udp_Socket->bind(QHostAddress::Any, 1104);
connect(Udp_Socket_RX, SIGNAL(readyRead()), this, SLOT(Receive()));
QByteArray Data {68,1,0};
Udp_Socket->writeDatagram(Data, address, 1004);

В-четвёртых, при чтении из сокета Address_RX и Port — это выходные параметры, их надо проверять после чтения, а не задавать до.

В остальном вроде всё... должно работать...

READ ALSO
Есть ли способ сократить код?

Есть ли способ сократить код?

Android Studio выдает предупреждение (длина метода = 20), что нижеследующий метод onNavigationItemSelected (длина = 21) содержит длинный кодЕсть ли способ сократить...

288
Найти значение в строке Java

Найти значение в строке Java

Предположим что у нас есть текстовик, в котором текст вида: Number = 1 Vasya Number = 2 Valera Number = 3 Kolya

303
Ошибка Java:modifier 'static' is only allowed in constant variable declarations

Ошибка Java:modifier 'static' is only allowed in constant variable declarations

Консоль с сайта codefights,подключенные библиотеки по умолчанию:

275