Qt 在可预测的秒数后跳过 UDP 数据包
Qt skipping UDP packet after a predictable number of seconds
我有这个程序,它通过与通过电缆直接连接到计算机网络适配器的设备进行通信来随着时间的推移进行测量。通信正在使用 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提供了解决方案。
我经常阻塞线程的事实似乎是原因。我仍然不明白为什么它只在几分钟后失败,为什么每次在相同的时间后失败(所以欢迎解释(。然而,问题已经解决了。谢谢大家的帮助!
相关文章:
- 发送固定大小的 UDP 数据包
- 使用C++将UDP数据包存储在Structure中
- 在高数据包速率下最大限度地减少丢弃的 UDP 数据包 (Windows 10)
- Qt 在可预测的秒数后跳过 UDP 数据包
- 高频接收UDP数据包:丢包?
- 为 posix recv 设置超时会导致 udp 数据包丢失吗?
- 了解 UDP 数据包大小限制的 TCP 数据包大小限制以及它在 boost::asio 编程级别的含义
- 获取进入UDP数据包的目标端口
- 操纵Windows Explorer窗口时,UDP数据包会掉落
- C++ 使用 recvmmsg 丢弃 UDP 数据包
- 如何在QT中接收适当的UDP数据包
- 使用ASIO捕获大量UDP数据包
- 如何正确接收多播UDP数据包
- 服务器未收到UDP数据包,花费数小时试图找出问题所在
- 当接收缓冲区几乎满时,阻止UDP数据包被部分截断
- 如何检查UDP数据包是否在发送器上发送
- 使用 QNX 实时操作系统实时接收 UDP 数据包
- 高效地发送UDP数据包流
- 为什么我在使用 winsock 时没有收到 UDP 数据包?
- SDL_net UDP 数据包数据