C++ 使用Qt套接字广播大数据
我在用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
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信号,我相信通过端口和主机时也是如此