项目场景:
通过Qt(6.1)的network模块实现TCP发送文字,在本地测试封装TCP包头功能。
问题描述
不对发送数据进行封装时,可正常收发。通过QDataStream来封装待发数据,其中在发送数据前加入quint32类型来存待发送数据的字节大小,接收端进行相应处理后,未能正确收到数据。
//部分TCP发送数据函数
QString msgInput = "TXT:" + ui->textInput->toPlainText();
//封装包头 加上数据大小
QByteArray dataSend;
QDataStream stream(&dataSend,QIODevice::WriteOnly);
stream << (quint32)0 << msgInput.toLocal8Bit();
stream.device()->seek(0);
//调试大小
qDebug() << dataSend.size();
stream << dataSend.size();
//调试发送内容
qDebug()<<dataSend;
//QTcpSocket *client
client->write(dataSend);
//部分TCP接受函数
//发送信号对象obj 转为QTcpSocket
QTcpSocket *socket = qobject_cast<QTcpSocket*>(obj);
//当前缓冲区数据的大小,收到的数据大小
qint64 sizeNow = 0;
do
{
//通过bytesAvailable获取当前收到的有效数据大小
sizeNow = socket->bytesAvailable();
if(sizeNow < sizeof(quint32))
{
return;
}
QDataStream stream(socket);
quint32 sizePack = 0;
stream >> sizePack;
//调试 接受缓存数据大小 和Pack数据大小
qDebug() << sizeNow << "-" << sizePack;
//包不完整返回
if(sizeNow < sizePack - 4)
{
return;
}
qDebug() << "full pack";
QByteArray datafull;
stream >> datafull;
}while(sizeNow >0);
原因分析:
不知道为啥,调试时在发送端显示发送内容为
接收端只能正常接受到大小值 12,“TXT:” 内容则丢失。
“TXT:” 前应该是封装进去的quint类型的值,此时应该是12才对,弄不懂,那个大神到时能给我解惑下,代码我是参考网上的,他的环境是Qt5.5.1。我反复看了很多遍,就是一样的代码出来效果不一样,不知道是不是环境有差异。
解决方案:
在反复查看调试信息中,发现接受端有时能接受到数据,有时会打印空格换行等,我就更改了保存数据字节大小的类型 从quint32改为quint64,对应接收端也改为相应类型,然后就成功接受到数据,在调试信息中也出现了些困惑。
//原为quint32
stream << (quint64)0 << msgInput.toLocal8Bit();
跟32位quint不同 64位为什么出现了10和04,分开的统计结果。
这个为记录贴,也希望有大神能给我解释下。