Qt 在可预测的秒数后跳过 UDP 数据包

Qt skipping UDP packet after a predictable number of seconds

本文关键字:UDP 数据包 Qt      更新时间:2023-10-16

我有这个程序,它通过与通过电缆直接连接到计算机网络适配器的设备进行通信来随着时间的推移进行测量。通信正在使用 UDP。

这里的问题是,在 N 秒后,程序无法拾取它期望的数据包(请求数据包被发送到设备,然后等待回复(。我有一个变量来决定每次测量之间等待多长时间,通过更改它,我不会更改 N,因此发送的数据包数量无关紧要。如果我重新启动应用程序并运行一个新序列(如在一长串测量中,中间有延迟(,它只会在 N 秒后再次停止。

N的观测值:~200s,~320s。 (有时会更改(可能在重新启动时((

我使用 wireshark 捕获数据包,根据该数据包实际上是由网络适配器接收的,因此这里出现故障的不是设备。我的应用程序使用的是Qt,并且是用C++编写的。

我有自己的UDP类,它使用QUdpSocket扩展QAbstractSocket,进而扩展QIODevice,我看到readyRead信号是在QIODevice类中声明的,这是我期望但未能接收的信号。

那么出了什么问题呢?为什么Qt没有反应?为什么在一段时间后?如果需要更具体的详细信息/代码,请告诉我。

我的 udp 类的构造函数的一部分

socket = new QUdpSocket();
socket->connectToHost(QHostAddress(*ipaddr), COM_LUX_PORT);    
connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()));

我的 udp 类中的 readyRead 插槽

void Udp::readyRead(){
// when data comes in
QByteArray buffer;
buffer.resize(socket->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
socket->readDatagram(buffer.data(), buffer.size(),
&sender, &senderPort);
qDebug() << "1Message: " << buffer.toHex();
emit messageReceived(buffer);
}

标头中的信号和插槽

signals:
/*!
Signal for transferring the received messages
*/
void messageReceived(QByteArray buffer);
public slots:
void readyRead();
void readyReadSock2();
void reConnectToIp(QString addr);
private slots:
void slotTimeout();

编辑#1:我发现了这个类似的问题,但有一个很大的区别,因为我收到数据包直到某个点。

编辑#2:一些相关的代码。

Ilbeldus提供了解决方案。

我经常阻塞线程的事实似乎是原因。我仍然不明白为什么它只在几分钟后失败,为什么每次在相同的时间后失败(所以欢迎解释(。然而,问题已经解决了。谢谢大家的帮助!