gpt4 book ai didi

c++ - QUdpsocket 在处理前一个数据报时丢失数据报

转载 作者:行者123 更新时间:2023-11-30 01:11:08 26 4
gpt4 key购买 nike

我通过 udp 拆分帧 (50Kb) 并将 frameId 添加到数据中,将未打包的图像 (bmp) 数据从一个应用程序 (unity) 发送到另一个应用程序 (QT)。另一方面,我正在尝试集成帧(使用 frameId),在我收集了一张图像的所有帧后,我将其作为图像处理。如果我只是捕获帧而不处理它们,我会按正确的顺序获取数据

void Server::readPendingDatagrams()
{
if (udpSocket->hasPendingDatagrams()) {
QByteArray datagram;
datagram.resize(udpSocket->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;

udpSocket->readDatagram(datagram.data(), datagram.size(),
&sender, &senderPort);
qDebug()<<datagram[0]; //frameId
//processTheDatagram(datagram);
}
}

我在控制台中看到“1 2 3 4 5 1 2 3 4 5 1 2 3 4 5”但是如果我取消注释 processTheDatagram(datagram);我得到“1 3 4 1 2 4 2 4 5 2 3 5”它在处理以前的数据报时丢失数据。哪里有问题??在 udp 缓冲区中?

最佳答案

Where is the problem?? in udp buffer?

问题是,如果套接字的接收缓冲区已满,那么计算机在缓冲区已满时收到的任何 UDP 数据包都将被丢弃。这不是错误,而是 UDP 工作方式的“特性”。

丢弃的 UDP 数据包只是生活中的一个事实;任何使用 UDP 的程序都必须以某种方式处理丢弃的 UDP 数据包。以下是您可以处理它们的一些方法(并非所有方法都是相互排斥的):

  1. 使您的 processTheDatagram() 函数如此高效,以至于它始终返回得足够快,以至于 UDP 缓冲区永远没有时间填满
  2. 在您的 QUDPSocket 上调用 setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption, someLargeValue) 以为其提供更大的内核接收缓冲区,这将需要更长的时间来填满
  3. 与其尝试在同一个线程中处理数据报,不如将数据报添加到 FIFO 队列中,让另一个线程完成繁重的工作。这样一来,您的 I/O 线程就可以始终空闲以快速接收下一个 UDP 数据包。
  4. 实现某种流量控制或数据包重发算法,这样数据包的发送速度不会超过您的计算机处理速度,或者如果数据包被丢弃,您可以请求再次发送它(尽管如果如果你走这条路,通常最好只使用 TCP)
  5. 在更快的计算机上运行 :)

关于c++ - QUdpsocket 在处理前一个数据报时丢失数据报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36462290/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com