Qt的UDP接收过一段时间后就收不到数据,readyRead() 信号不触发的彻底解决方法
在做一个Qt的UDP通信的软件时,发现UDP接收端运行一段时间后再也收不到数据,表现为readyRead()
信号对应的槽函数再也得不到执行,但是UDP的缓冲区是有数据的(bytesAvailable()函数返回值不为0)。
查阅网上资料发现这可能是Qt的一个Bug,有种说法是如果在从缓冲区读数据时,如果socket再写数据,readyRead()
信号便不会再触发。
最终彻底的解决方法是:手动发送readyRead()
信号。具体措施是:开一个如10ms的计数器,在定时器槽函数中通过调用bytesAvailable()查询UDP接收缓冲区是否有数据,若bytesAvailable()返回值不为0,则调用 emit m_socket.readyRead
(),手动发射一个readyRead
()信号,问题最后完美解决!
我的Qt版本是4,用的编译器版本为MSVC2010,不知道后续的Qt版本有没有解决这个问题。