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