解决QT UDP接收一段时间后接收不到的问题
现象:
创建QUdpSocket对象后一段时间内能够接收到数据正常读取,过后就读取不到数据,但是抓包工具wireshark看还在发没有停过
解决:
目前还没有找到问题,测试过也不是内存溢出或速度不匹配的问题,单纯是这个socket没有数据给出。参考过一位老哥的解决方案:https://blog.csdn.net/zhulichen/article/details/52491132 他的逻辑是有问题的,但是思路可以借鉴
定义一个全局变量err_cnt,比如说你的接收周期大概是10ms一次,你可以定个2ms(自己根据需求定)的计数器用来递增这个计数值,每次接收到数据就就将它清零。在定时器里当计数值err_cnt到10(自己定)就说明这个socket已经失效了,可以将它delete掉然后重新创建一个socket重新初始化便可以延续接收,完美解决。
定时器具体代码:
void MainWindow::onTimeout()
{
socket_err_cnt++;
if (socket_err_cnt >= 5)
{
cout<<"error socket!"<<endl;
socket_err_cnt = 0;
socket->close();
socket = new QUdpSocket();
socket->bind(QHostAddress("192.168.1.3"),6666);
connect(socket, SIGNAL(readyRead()), this, SLOT(receive()));
}
}
但是,真要解决这个问题可以考虑用windows或linux下系统自带的socket通信API试试,不要用qt封装过的方法。