Так что у меня возникает странная проблема: когда я читаю данные (QDataStream) в QTcpSocket: некоторые данные, похоже, отсутствуют. Функция bytesAvailable () возвращает правильное количество байтов для чтения, но, похоже, QDataStream не содержит все байты.
Прежде всего, так выглядят данные:
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 байтов находятся в сокете. Чего мне не хватает?
Ваша помощь очень ценится! Спасибо!