我有这个程序,通过与通过电缆直接连接到我的计算机网络适配器的设备进行通信来测量一段时间。通信正在使用UDP。
这里的问题是,在N秒之后,程序无法获取它所期望的数据包(请求数据包被发送到设备,然后它等待回复)。我有一个变量决定每次测量之间等待多长时间,通过更改它我不会改变N,所以发送的数据包数量不相关。如果我重新启动应用程序并运行一个新序列(如在一长串测量中间有延迟),它会在N秒后再次停止。
观察到N:〜200s,~320s的值。 (它有时会改变(可能在重新启动时))
我使用wireshark捕获数据包,并且根据该数据包实际上是由网络适配器接收的,所以它不是在这里失败的设备。我的应用程序使用的是Qt,是用C ++编写的。
我有自己的UDP类正在使用QUdpSocket扩展QAbstractSocket,而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:我发现了this类似的问题,但是存在一个主要的区别,因为我收到的包很好,直到某一点。
编辑#2:一些相关的代码。
答案 0 :(得分:0)
Ilbeldus提供了解决方案。
我经常阻止线程的事实似乎是原因。我仍然不明白为什么它只会在几分钟后失败,为什么它在每次相同的时间后都会失败(欢迎解释)。然而问题已经解决了。谢谢你的帮助,全部!