TCP封包拆包

  • 前言
  • 封包
    • 一、包结构
    • 二、封包方法
  • 拆包
  • 总结

前言

TCP协议(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的通信协议,即TCP采用字节流的方式,以字节为单位传输字节序列。
如果简单的发送长串的数据流,那么我们接收到的就是一串无规则的字节流,即不知道哪里开始读,到哪里截止,那么就会出现丢包、粘包现象。如果要让这无规则的字节流有规则,那么就需要我们去定义一个规则,那便是所谓的“封包规则”,相对应的就是“拆包规则”。

封包

一、包结构

简单来说就是给每次发送的完整数据进行包装处理,在包装纸上打上标签,来告诉别人里面都有啥,那么我们就可以通过包装纸来进行分辨。
一般封包结构如下:

其中,包头与包尾标识只是用来寻找数据,数据类型标识可以对应区别不同结构数据解码规则,数据长度可以用来判断数据是否完整。

typedef struct
{unsigned long packHead;unsigned long dataType;unsigned long dataLen;char buf[dataLen];unsigned long packTail;
}PACKSTRUCT;

二、封包方法

这里封包方法采用memcpy函数对数据进行打包,主要就是memcpy函数的调用,不了解的可以在封包时发现的关于QIODevice类write函数的坑一文中参考。

拆包

拆包流程图:

总结

用该方法进行多文件传输明显会比我之间所用的方法好,之前的方法见Qt多文件传输功能实现及方法概述。用该方法的代码之后贴出。

TCP解决粘包问题(结构数据封包拆包)相关推荐

  1. TCP利用封包和解包解决“粘包”问题

    本文参考自徐晓鑫<后台开发>,给出一个可实际应用的demo,该demo核心在于封包和解包的思想,以及自定义发送.接收数据. 一.TCP粘包现象 what? TCP是个"流&quo ...

  2. tcp的粘包和拆包示例以及使用LengthFieldFrameDecoder来解决的方法

    tcp的粘包和拆包示例以及使用LengthFieldFrameDecoder来解决的方法 参考文章: (1)tcp的粘包和拆包示例以及使用LengthFieldFrameDecoder来解决的方法 ( ...

  3. 【Netty】Netty解决粘包和拆包问题的四种方案

    在RPC框架中,粘包和拆包问题是必须解决一个问题,因为RPC框架中,各个微服务相互之间都是维系了一个TCP长连接,比如dubbo就是一个全双工的长连接.由于微服务往对方发送信息的时候,所有的请求都是使 ...

  4. Netty 解决粘包和拆包问题的四种方案

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://my.oschina.net/ ...

  5. Netty解决粘包和拆包问题的四种方案

    在RPC框架中,粘包和拆包问题是必须解决一个问题,因为RPC框架中,各个微服务相互之间都是维系了一个TCP长连接,比如dubbo就是一个全双工的长连接.由于微服务往对方发送信息的时候,所有的请求都是使 ...

  6. TCP协议——粘包与拆包

    TCP的基础 TCP协议基础,传送门 TCP协议流量控制,传送门 1.1 什么是TCP粘包/拆包 TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想想河里的流水,是连 ...

  7. netty 高低位转码_Netty解决粘包和拆包问题的四种方案

    在RPC框架中,粘包和拆包问题是必须解决一个问题,因为RPC框架中,各个微服务相互之间都是维系了一个TCP长连接,比如dubbo就是一个全双工的长连接.由于微服务往对方发送信息的时候,所有的请求都是使 ...

  8. kafka是如何解决粘包拆包的

    本文来说下kafka是如何解决粘包拆包的 文章目录 概述 kakfa是如何解决粘包拆包问题的呢 本文小结 概述 前面笔者写了一篇文章一文讲清粘包拆包 全面的讲解了TCP粘包拆包相关的问题.下面进行一个 ...

  9. Netty是如何解决粘包和拆包问题的

    本文来说下Netty是如何解决粘包和拆包问题的 文章目录 概述 粘包和拆包 常见解决方案 Netty提供的粘包拆包解决方案 FixedLengthFrameDecoder LineBasedFrame ...

最新文章

  1. 11: facebook原生登录
  2. python 线性回归_用Python实现线性回归算法
  3. DDD峰会归来话DDD
  4. 机器狗常州巡逻防疫,喊话“不扎堆不聚集”,网友:给孩子安个狗头吧
  5. MySQL如何向表中增加、修改字段
  6. Eclipse-cvs指南
  7. 如何产生cpk图形_PPK与CPK定义,差异分析及计算
  8. Vissim 中动态交通路径选择
  9. Windows Server 2008 多元密码策略配置
  10. 使用Axure设计中,大型的后台系统原型总结
  11. 圆柱属于能滚动的物体吗_滚动轴承中摩擦的主要来源,轧机轴承技术(一)
  12. Linux驱动开发-编写OLED显示屏驱动
  13. C/C++多线程面试题
  14. BottomNavigationView--基本使用总结
  15. 感谢同事的临别赠言,愿自己一路顺风
  16. ipcs中的dest是什么意思
  17. Neural Controlled Differential Equations forIrregular Time Series(NIPS2020)
  18. python实训日志_最新Python实训周总结
  19. 使用XUL开发跨平台桌面应用
  20. javascript英语单词音节拆分_拆分音节拼读法解析

热门文章

  1. AllTray-将办法最小化到琐细托盘
  2. MSMQ(MicroSoft Message Queue,微软消息队列)
  3. avi和音频合成 ffmpeg_使用Java和ffmpeg把音频和视频合成视频的操作方法
  4. php中什么是函数函数的意义是什么,php中arsort函数的功能起什么作用呢?
  5. 从 class 文件 看 synchronize 锁膨胀过程(偏向锁 轻量级锁 自旋锁 重量级锁)
  6. Java代理模式——静态代理动态代理
  7. Java 字节和字符流的读写+Buffered
  8. 信息抽取--关键词提取
  9. linux版本的redis bin,Linux下安装Redis4.0版本(简便方法)
  10. (JAVA)获取对象