c++ - 为什么我的类(class)没有通过Qt QUDPSocket接收UDP数据报?

标签 c++ qt qudpsocket

我正在尝试开发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);

尝试运行多播接收器(https://doc.qt.io/qt-5/qtnetwork-multicastreceiver-example.html)的Qt示例时,它会很好地读取数据报。
在我的应用程序中使用相同的代码,什么都没读。

感谢谁会帮助我。

最佳答案

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

如果使用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());

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

我的 friend ,让我们努力吧!

关于c++ - 为什么我的类(class)没有通过Qt QUDPSocket接收UDP数据报?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61653434/

相关文章:

c++ - 生成 C++ 在 Atom 中包含 header 保护?

c++ - boost::thread 变量的前向声明

python - 如何阻止 QThread 关闭?

c++ - 如何在 Linux 中为 Qt 应用程序制作控制台 cmd?

c++ - Qt QUdpSocket : readyRead() signal and corresponding slot not working as supposed

c++获取TwoRandomNumbers,最小值和最大值

c++ - 使用 Qt 和 Boost 为应用程序编译 CppUTest 测试时的奇怪行为

qt - QQuickItem::mapToItem 返回类型是什么?

c++ - 如何使用 QUdpSocket 连接服务器和路由器后面的客户端?

c++ - C++/Qt 中的 UDP 服务器-客户端聊天