c++ - 为什么我的班级没有使用 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)它可以很好地读取数据报。在我的应用程序中使用相同的代码,没有读取任何内容。
感谢谁会帮助我。
解决方案
我将尝试为您提供一些提示。
如果您使用 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());
也许条件不满足,但在第二个周期它可能会起作用!
让我们努力吧,我的朋友!
推荐阅读
- apache-spark - 为什么 Spark 在一个简单的 JDBC 转换中生成许多 MapPartitionsRDD?
- c++ - 在 C++ 中将引用声明为 auto
- android - 在 spyk 对象上存根方法会立即调用原始方法
- flutter - 带有 2 个子图标和(扩展)文本(长)的行,它们之间有空格
- python - SciKitlearn ColumnTransformer TypeError:无法克隆对象。您应该提供一个 scikit-learn 估计器的实例而不是一个类
- java - 是否可以在 TextArea JavaFX 中添加项目符号列表模式
- matlab - 为 Mac 添加 NetLogo 扩展的问题
- nestjs - NestJS:我的控制器不发送响应
- javascript - Thymeleaf:如何搜索具有变量索引的数组?
- sql - 有没有办法在表的所有字段中搜索字符串并根据找到字符串的位置返回一个字段?