Неполные данные в QDataStream при чтении из QTcpSocket - PullRequest
1 голос
/ 10 января 2020

Так что у меня возникает странная проблема: когда я читаю данные (QDataStream) в QTcpSocket: некоторые данные, похоже, отсутствуют. Функция bytesAvailable () возвращает правильное количество байтов для чтения, но, похоже, QDataStream не содержит все байты.

Прежде всего, так выглядят данные:

enter image description here

bufferX всегда содержит 768 операций с плавающей запятой, а bufferY всегда содержит 5376 операций с плавающей запятой. Поэтому я ожидаю, что общее количество отправляемых данных будет (без учета размера блока): int + 768 float + 5376 float = 4 + 3072 + 21504 = 24580 байт .

Теперь, вот код отправителя:

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 байтов находятся в сокете. Чего мне не хватает?

Ваша помощь очень ценится! Спасибо!

...