1

所以我有一个奇怪的问题,当我在 QTcpSocket 上读取数据(QDataStream)时:一些数据似乎丢失了。bytesAvailable() 函数将返回要读取的适当字节数,但 QDataStream 似乎并没有保存所有字节。

首先,这是数据的外观:

在此处输入图像描述

bufferX 总是包含 768 个浮点数,而 bufferY 总是包含 5376 个浮点数。因此,我希望发送的总数据为(不包括块大小):int + 768 floats + 5376 floats = 4 + 3072 + 21504 = 24580 bytes

现在,这里是发件人代码:

void ClientSocket::serverTaskResult()
{
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_DefaultCompiledVersion);

    out << quint16(0);

    out << mServerTask->getNPoints();

    for (size_t i = 0; i < BUFFERX_SIZE; i++)
        out << mServerTask->getBufferX(i);

    for (size_t i = 0; i < BUFFERY_SIZE; i++)
        out << mServerTask->getBufferY(i);

    out.device()->seek(0);
    out << quint16(block.size() - sizeof(quint16));

    write(block);

    out << quint16(0xFFFF);
}

这是接收方代码:

void TestClient::recoverResult()
{
    QDataStream in(&mTcpSocket);
    in.setVersion(QDataStream::Qt_DefaultCompiledVersion);

    float wBufferX[BUFFERX_SIZE];
    float wBufferY[BUFFERY_SIZE];
    int wNPoints;

    forever{
        if (mNextBlockSize == 0) 
        {
            qint64 nBytesAvailable = mTcpSocket.bytesAvailable();
            if (nBytesAvailable < sizeof(quint16))
                break;
            in >> mNextBlockSize;
        }

        if (mNextBlockSize == 0xFFFF) 
        {
            closeConnection();
            break;
        }

        if (mTcpSocket.bytesAvailable() < mNextBlockSize)
            break;

        for (size_t i = 0; i < BUFFERX_SIZE; i++)
            in >> wBufferX[i];

        for (size_t i = 0; i < BUFFERY_SIZE; i++)
            in >> wBufferY[i];

        in >> wNPoints;

        mNextBlockSize = 0;
    }
}

现在,我注意到的第一件奇怪的事情是 nBytesAvailable 的值总是 49158,大约是我预期的两倍。我收到的字节数是预期的两倍怎么办?

其次,由于我有所有这些字节可用,我希望 QDataStream 能够正确填充缓冲区。然而,在 315 到 350 次浮点数之后,QDataStream 似乎包含不可用的数据。也就是说,wBufferX将在其前 315-350 个索引中定义(并纠正)值,然后再定义未知值。我不明白这是怎么回事,因为bytesAvailable()清楚地表明套接字上有近 50 000 个字节。我错过了什么?

非常感谢您的帮助!谢谢!

4

0 回答 0