用Qt套接字广播大数据

Broadcast large data with Qt sockets

本文关键字:数据 广播 套接字 Qt      更新时间:2023-10-16

我正在使用QT,我需要广播数据,所以我尝试使用QUdpSocket。但是数据可能太大(在writeDatagram之后,QUdpSocket::error返回DatagramTooLargeError)。所以我拆分数据并多次调用writeDatagram到各个部分。但是Received套接字只接收一次数据,只接收第一个数据包。接收码

connect(&m_socketReceiver, &QUdpSocket::readyRead, this, &LocalNetSharing::onDataRead);
void LocalNetSharing::onDataRead()
{
while (m_socketReceiver.hasPendingDatagrams())
{
    QByteArray datagram;
    datagram.resize(m_socketReceiver.pendingDatagramSize());
    m_socketReceiver.readDatagram(datagram.data(), datagram.size());
    //process data
}
}

来自QUdpSocket class的Qt文档:

注意:当您接收到readyRead()信号,否则将不会为下一个数据报。

因此,您似乎没有在每次调用onDataRead时读取整个数据报。

您没有在readDatagram中指定主机和端口。我不确定这是否是原因,但正确的形式是:

while (m_socketReceiver.hasPendingDatagrams())
{
     QByteArray datagram;
     datagram.resize(m_socketReceiver.pendingDatagramSize());
     m_socketReceiver.readDatagram(datagram.data(), datagram.size(), host, &port);
     //process data
}