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多文件传输功能实现及方法概述。用该方法的代码之后贴出。