当前位置: 首页 > news >正文

qt linux封包,QTcpSocket 通讯 ( 服务器、客户端、封包、解包 )

// 读取 socket 数据

void SocketClient::OnReadyRead()

{

QTcpSocket *socket = qobject_cast(sender());

if(socket == m_dataSocket )

{

m_dataPacket.data += socket->readAll();

// 循环解析包数据,m_dataPacket.data 中可能不只一包数据

bool isOk = false;

do{

isOk = parsePacket(socket, &m_dataPacket);

}while(isOk);

}

else

{

MY_LOG("socket connection abnormal");

}

}

// 解包

bool SocketClient::parsePacket(QTcpSocket *socket, SocketPacket *packet)

{

int pIndexStart = packet->data.indexOf(NET_PACKET_START);

if(pIndexStart < 0)

{

return false;

}

packet->data = packet->data.mid(pIndexStart); //截取从包头index_start到末尾的数据

SocketPacket tmpPacket;

tmpPacket.data = packet->data;

tmpPacket.data.remove(0, QByteArray(NET_PACKET_START).size());//删除包头

//解析包长度

if(tmpPacket.data.count() < NET_PACKET_LTNGTH_BYTES)

{

return false;

}

bool isOk;

tmpPacket.length = tmpPacket.data.mid(0, NET_PACKET_LTNGTH_BYTES).toLong(&isOk);

if(isOk == false)

{

packet->data.remove(0, QByteArray(NET_PACKET_START).size());//删除包头

if(packet->data.indexOf(NET_PACKET_START) >= 0)

{

return true;//有可能出现粘包的情况,继续解析后面数据

}

else

{

return false;

}

}

//数据到达包长度

tmpPacket.data.remove(0, NET_PACKET_LTNGTH_BYTES);//删除数据长度

if(tmpPacket.length > tmpPacket.data.count())

{

return false;

}

//包尾是否匹配

tmpPacket.data.resize(tmpPacket.length);//删除多余数据

if(tmpPacket.data.endsWith(NET_PACKET_END) == false)

{

packet->data.remove(0, QByteArray(NET_PACKET_START).size());//删除包头

if(packet->data.indexOf(NET_PACKET_START) >= 0)

{

return true;//有可能出现粘包的情况,继续解析后面数据

}

else

{

return false;

}

}

tmpPacket.data.resize(tmpPacket.length -

QByteArray(NET_PACKET_END).count()); //删除包尾

//解析出数据类型

if(tmpPacket.data.count() < NET_PACKET_TYPE_BYTES)

{

return false;

}

QByteArray dataType = tmpPacket.data.left(NET_PACKET_TYPE_BYTES);

tmpPacket.dataType = dataType;

tmpPacket.data.remove(0, NET_PACKET_TYPE_BYTES);//删除数据类型

//发送数据包消息

if(socket == m_dataSocket)

{

emit dataPacketReady(tmpPacket);

}

//删除当前包数据

packet->data.remove(0,

QByteArray(NET_PACKET_START).size()

+ NET_PACKET_LTNGTH_BYTES

+ tmpPacket.length);

return true;

}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 整理了一天
  • linux配置svn如何检出,Linux CentOS下配置SVN+SVN勾子
  • os x arm-linux,在 OS X 下构建 ARM 64 镜像
  • 晚上的校园歌手晚会
  • linux fs源代码分析,BlueFs源代码分析报告.doc
  • Get Information from Tracert Command
  • securecrt linux开发板,SecureCRT 登陆虚拟机中Ubuntu详解
  • 西直门交警
  • c语言文件分割与合并程序详解,如何实现将一个文件分割成多个小文件
  • 使用dbms_rowid包获得rowid的详细信息
  • 高斯消元法的应用
  • 小波 c语言实现,小波分析算法的公式与C语言实现
  • 输入一行数字把5都看成空格 C语言,算法设计习题整理112.doc
  • 值得尊敬的---抵抗之都费卢杰
  • 风潇潇兮
  • 30秒的PHP代码片段(1)数组 - Array
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • Cookie 在前端中的实践
  • Logstash 参考指南(目录)
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • python大佬养成计划----difflib模块
  • 阿里云前端周刊 - 第 26 期
  • 分布式熔断降级平台aegis
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 开源地图数据可视化库——mapnik
  • 马上搞懂 GeoJSON
  • 深入 Nginx 之配置篇
  • 湖北分布式智能数据采集方法有哪些?
  • ​虚拟化系列介绍(十)
  • #QT项目实战(天气预报)
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (C++20) consteval立即函数
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (四)c52学习之旅-流水LED灯
  • (四)linux文件内容查看
  • (译)2019年前端性能优化清单 — 下篇
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)Linq学习笔记
  • (自用)gtest单元测试
  • .cn根服务器被攻击之后
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET命令行(CLI)常用命令
  • .NET中统一的存储过程调用方法(收藏)
  • .NET周刊【7月第4期 2024-07-28】
  • .ui文件相关
  • /etc/sudoers (root权限管理)
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [20190401]关于semtimedop函数调用.txt