首页 > 解决方案 > 为什么我的班级没有使用 Qt QUDPSocket 接收 UDP 数据报?

问题描述

我正在尝试开发一个 UDP 数据报接收器来从通过 UDP 数据报更新信息的 UDP 服务器读取数据包。我想接收数据报并在更新数据后读取有效负载。我按照 Qt 教程示例来开发多播接收器。我只是复制了代码,但是,虽然示例接收并读取数据报,但我的应用程序中的相同代码却没有。它不想工作。我错了什么?

这是我开发的类的代码:

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)它可以很好地读取数据报。在我的应用程序中使用相同的代码,没有读取任何内容。

感谢谁会帮助我。

标签: c++qtqudpsocket

解决方案


我将尝试为您提供一些提示。

如果您使用 Windows 您需要关闭防火墙或将您的应用程序添加到它的列表中。下一步。您可以尝试将变量切换QUdpSocket m_socketQUdpSocket *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());

也许条件不满足,但在第二个周期它可能会起作用!

让我们努力吧,我的朋友!


推荐阅读