QUdpsocket在用如下方法响应readyRead信号一段时间之后就再也不触发readyRead信号了:

void UdpClientSocketCommun::ReadDataFromSocket()
{
    QHostAddress sender;
    quint16 senderPort;
    Log::GetInstance()->WriteInfoLog("inside the %s", __FUNCTION__);
    while (m_pUdpClient->hasPendingDatagrams())
    {
        m_readByteArray.resize(m_pUdpClient->pendingDatagramSize());
        m_pUdpClient->readDatagram(m_readByteArray.data(), m_readByteArray.length(), &sender, &senderPort);
    }
}

这是因为这种方法读取数据有BUG,如果在读取过程中又有新的数据过来,已经触发了readyread信号了,但是实际上上面的while(m_pUdpClient->hasPendingDatagrams())已经早就把数据读取出去了,后面触发readyread信号时进来这个槽函数读取的数据为空,后面估计就是QT的BUG,下次readyRead信号就再也不响应了。

要解决这个问题有两个方法:

1、最简单的就是直接去除上面的while循环,每次直接readDatagram.

2、改成直接用QAbstractSocket中的ReadyAll()接口直接每次触发readyread信号时读取全部数据就没有这种问题。

Logo

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

更多推荐