在做一个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版本有没有解决这个问题。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐