Почему мой класс не получает дейтаграммы UDP с Qt QUDPSocket? - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь разработать приемник датаграмм UDP для чтения пакетов с сервера UDP, которые обновляют информацию через датаграммы UDP. Я хочу получать датаграммы и после обновления данных считывать полезную нагрузку. Я последовал примеру Qt Tutorial для разработки многоадресного приемника. Я просто скопировал код, но хотя пример получает и читает дейтаграмму, тот же код в моем приложении этого не делает. Работать не хочет. В чем я ошибаюсь?

вот код класса, который я разработал:

UDPDataReceiver.h

class UDPDataReceiver: public QObject
{
    Q_OBJECT

public:
    explicit UDPDataReceiver(QObject *parent = nullptr);

public slots:
    void readPendingDatagrams();

private:
    QUdpSocket m_socket;
    QHostAddress groupAddress4;

};

UDPDataReceiver. cpp

UDPDataReceiver::UDPDataReceiver(QObject *parent) : QObject(parent),
    groupAddress4(QStringLiteral("234.5.6.7"))
{
    const QHostAddress &localhost = QHostAddress(QHostAddress::LocalHost);
//    for (const QHostAddress &address: QNetworkInterface::allAddresses()) {
//        if (address.protocol() == QAbstractSocket::IPv4Protocol && address != localhost)
//             qDebug() << address.toString();
//    }

    bool bound = m_socket.bind(localhost, 2471, QUdpSocket::ShareAddress);
    bool joined = m_socket.joinMulticastGroup(groupAddress4);
    connect(&m_socket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
}

void UDPDataReceiver::readPendingDatagrams()
{
    QByteArray datagram;

    while (m_socket.hasPendingDatagrams()) {
        datagram.resize(int(m_socket.pendingDatagramSize()));
        m_socket.readDatagram(datagram.data(), datagram.size());
       qDebug()<<datagram.constData()<<"Example implementation";
    }
}

В конструкторе моего класса MainWindow я вызываю следующий код для создания экземпляра получателя.

 dataReceiver = new UDPDataReceiver(this);

Попытка запустить пример Qt многоадресного получателя (https://doc.qt.io/qt-5/qtnetwork-multicastreceiver-example.html) хорошо читает дейтаграммы. С тем же кодом в моем приложении ничего не читалось.

Спасибо кому поможет.

1 Ответ

1 голос
/ 07 мая 2020

Я постараюсь помочь вам парой советов.

Если вы используете Windows, вам нужно выключить брандмауэр или добавить свое приложение в его список. Следующий шаг. Вы можете попробовать заменить вашу переменную QUdpSocket m_socket на QUdpSocket *m_socket. И попробуйте использовать цикл do{}while() как этот код:

do
{
    datagram.resize(int(m_socket.pendingDatagramSize()));
    m_socket.readDatagram(datagram.data(), datagram.size());
    qDebug()<< datagram.constData() <<"Example implementation";
}while(m_socket.hasPendingDatagrams());

Возможно, условие не выполняется, но во втором цикле оно, вероятно, сработает!

Давай попробуем, дружище!

...