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信号时读取全部数据就没有这种问题。