Qt实现TCP发送文字时封装发送数据出现问题

项目场景:

通过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();

修改后发送端的调试信息,其中10表示16字节,04表示“TXT:”4字节
跟32位quint不同 64位为什么出现了10和04,分开的统计结果。
这个为记录贴,也希望有大神能给我解释下。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值