Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Qt套接字广播大数据_C++_Qt_Sockets_Udp_Qudpsocket - Fatal编程技术网

C++ 使用Qt套接字广播大数据

C++ 使用Qt套接字广播大数据,c++,qt,sockets,udp,qudpsocket,C++,Qt,Sockets,Udp,Qudpsocket,我在用QT。我需要广播数据,所以我尝试使用QUdpSocket。但是数据可能太大(在writeDatagramQUdpSocket::error返回DatagramTooLargeError之后)。因此,我分割数据,并多次调用writeDatagram,以处理这些部分。但接收到的套接字只接收一次数据,只有第一个数据包。接收代码为 connect(&m_socketReceiver, &QUdpSocket::readyRead, this, &LocalNetSharin

我在用QT。我需要广播数据,所以我尝试使用
QUdpSocket
。但是数据可能太大(在
writeDatagram
QUdpSocket::error
返回
DatagramTooLargeError
之后)。因此,我分割数据,并多次调用
writeDatagram
,以处理这些部分。但接收到的套接字只接收一次数据,只有第一个数据包。接收代码为

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
类的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
}

无法保证UDP数据包将被传递。还有一些延迟问题需要考虑。如果数据报未立即发送,则您的
while
循环可能无法及时看到它并退出。@CaptainObvlious我理解while循环无法看到它,但在这种情况下,应发出另一个readyRead信号,我相信通过端口和主机时也是如此