C++ QTcpSocket在读取大容量数据时读取一些额外字节?

C++ QTcpSocket在读取大容量数据时读取一些额外字节?,c++,linux,windows,qt,C++,Linux,Windows,Qt,我目前正在开发QtGUI应用程序,它从服务器(LINUX服务器)接收数据包 在正常情况下,它可以正常工作,但当服务器在套接字上写入大量数据包时,客户端套接字进入循环以处理该数据,但最后会留下8个额外字节,这些字节不属于我的应用程序,而应用程序从未从循环中出来,这会使我的应用程序无响应。 我收到的所有数据没有任何损失 我的代码将清除更多内容: connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(receiveData())); void MyCl

我目前正在开发QtGUI应用程序,它从服务器(LINUX服务器)接收数据包

在正常情况下,它可以正常工作,但当服务器在套接字上写入大量数据包时,客户端套接字进入循环以处理该数据,但最后会留下8个额外字节,这些字节不属于我的应用程序,而应用程序从未从循环中出来,这会使我的应用程序无响应。 我收到的所有数据没有任何损失

我的代码将清除更多内容:

connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(receiveData()));

void MyClass::receiveData()
{
    char recvbuf[MAXPACKET]; // MAXPACKET = 4096
    char* packet = 0;
    int bytesAvailable = 0;
    int bufSize = MAXPACKET;

    while((bytesAvailable > 0) || tcpSocket ->bytesAvailable())
    {
       if (bytesAvailable == 0 && tcpSocket ->bytesAvailable())
       {
          qint64 requestBytes = bufSize - bytesAvailable;
          bytes = tcpSocket->read(recvbuf + bytesAvailable, requestBytes);
          bytesAvailable += bytes;
       }

       //createPAcket and process Packets method works here
       if (packet)
         processPacket(packet);
    }
}

若要更改while条件,则必须停止循环,并在bytesAvailable()方法表示不再有字节时返回。并没有保证你们可以在发送的相同数据块中获得数据,TCP是流协议。也许你们可以发布一些更完整的代码?在上面的例子中,
packet
始终为0,我们无法看到
recvbuf
发生了什么。问题解决了。实际上,在写入和读取数据块时会有延迟,如果服务器写入了4000字节,那么另一方面,客户机正忙于处理该数据。在处理的4000字节结束时,可能还剩下一些字节,比如说,可能还剩下4个字节,它们可能属于下一个数据包,该数据包尚未进入套接字,并且系统处于while循环中。现在我退出while,通过在下一个块的开头添加next来读取这4个字节。也许你应该发布你自己的答案作为解决方案?