C++ 我的C++;代码无法处理(一点点)快速数据通信

C++ 我的C++;代码无法处理(一点点)快速数据通信,c++,c,qt,sockets,networking,C++,C,Qt,Sockets,Networking,背景: 我有以下C++代码,在端口 26009 < /COD>中侦听UDP包,然后输出接收到的包 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { udpSocket.bind(26009); //the port that GUI listens (26009) connect(&udpSocket, SIGNAL(readyR

背景:

我有以下C++代码,在端口<代码> 26009 < /COD>中侦听UDP包,然后输出接收到的包

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{

    udpSocket.bind(26009); //the port that GUI listens (26009)
    connect(&udpSocket, SIGNAL(readyRead()), this, SLOT(readyRead()));
}


void MainWindow::readyRead(){
    QByteArray datagram;
    do {
      datagram.resize(udpSocket.pendingDatagramSize());
      udpSocket.readDatagram(datagram.data(), datagram.size());
    } while (udpSocket.hasPendingDatagrams());

    qDebug() << "Message: " << datagram;
}
<>我在不同的Linux设备上运行C++(Server)和C(客户端)代码。p> 问题:

C代码运行良好,并生成数据包。我可以在Wireshark上看到数据包是在接收端(C++)接收的

但是,上面的C++代码不能正确地接收(或处理)数据包,它对代码来说处理得太快,而我只看到耦合输出,例如

hi5
hi14

如果传输的频率在C代码上明显减慢(添加<代码>睡眠(1)< /代码>),则C++代码输出数据包精细。 问题:

我使用收到的UDP数据包更新GUI(Qt)上的一些信息。我猜
slot
会导致慢度,如果我使用
pthread
侦听数据包,代码会处理通信量,但是线程需要如何通知主类,以便GUI可以相应地更新


<> P>在Windows主页上的Read Yead读取函数中,您建议如何修改C++代码,以便处理快速的数据流量,并通知GUI更新?

< P>。
QByteArray datagram;
do {
      qint64 dSize = udpSocket.pendingDatagramSize();
      datagram.resize(dSize);

      udpSocket.readDatagram(datagram.data(), dSize);
   } while (udpSocket.hasPendingDatagrams());
如果第一个数据包是8字节长的,那么将QByteArray设置为8字节并读取数据

在读取8个字节时,如果接收到6个字节,第二次循环时,您将调用字节数组上的resize,但这次它将把它从8个字节减少到6个字节,然后读取6个字节,丢弃以前读取的数据

与其调整QByteArray的大小,不如将数据附加到它:-

QByteArray datagram;
do 
{     datagram.append(udpSocket.pendingDatagramSize());
      udpSocket.readDatagram(datagram.data(), datagram.size());
}while (udpSocket.hasPendingDatagrams());

或者,将
qDebug()
输出(和QByteArray)移动到循环体中。我认为从UDP附加数据报没有意义,这不是一个流协议,数据报通常是独立的实体。@UlrichEckhardt,这取决于OP对数据的实际处理方式。如果你只是想把它打印出来,那么是的,把它移到身体里就足够了。无论哪种方式,问题都是一样的,即在显示数据之前覆盖数据。我见过UDP用于流数据,特别是在多人游戏中,因为它比TCP更快。当然,还需要控制一些事情,比如数据包的顺序等。如果我用append测试它,它会显示2个数据包的前几个字节和其余的第一个字节。它总共输出大约15个数据包。正如Ulrich所建议的,如果我将qDebug()和QByteArray添加到循环中,它将输出20个数据包,但只输出第一个字节。若我保持resize并将qDebug()和QByteArray添加到循环中,那个么它将正确地输出20个包含所有字节的数据包。我应该保留resize还是使用append?我已经更新了答案中的代码。这有用吗?
QByteArray datagram;
do 
{     datagram.append(udpSocket.pendingDatagramSize());
      udpSocket.readDatagram(datagram.data(), datagram.size());
}while (udpSocket.hasPendingDatagrams());