所以我有一个奇怪的问题,当我在 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 个字节。我错过了什么?
非常感谢您的帮助!谢谢!