通讯过程中连包分包问题的解决

本文介绍了一种轻巧的PacketExtractor类,用于解决通讯协议处理中的连包、分包问题。通过分层思想和C++技术,用户只需派生并重载几个函数,即可轻松完成拆包和组包任务,为通讯过程中的连包问题提供通用解决方案。
摘要由CSDN通过智能技术生成

博主按: 本来是打算发到什么期刊上面骗点稿费的. 所以, 虽然东西很简单, 但写到很详细. 可是我发过去. 就象石沉大海一般. 连一个确认的 mail 都没有. 郁闷. 还是发表在自己的 blog 上吧. 呵呵. 在这里我说了算. 这里插入图片比较麻烦. 所以, 想要看代插图的完整版, 请下载 doc 文件:

http://nicoster.googlepages.com/packetextractor.rar

 

摘要 通讯协议的处理过程中往往要处理连包, 分包的问题. 本文实现了一个轻巧的 PacketExtractor , 运用分层的思想, 结合模板, 虚函数等技巧. 让用户只需要简单的派生自己的类, 重载 4 个方法, 即可轻松完成拆包组包的任务. 给通讯过程中的连包问题提供了一个普适的解决方案.

 

关键字 通讯 协议 连包 粘包 分包 组包 虚函数 模板 PacketExtractor

 

引言

所谓连包, 分包问题. 比如说. 根据通讯协议, 发送了两条命令. 第一条命令 80 字节. 第二条命令 120 字节. 但接受方收到数据的时候, 可能第一次收到 150 个字节. 第二次收到 50 个字节. 要正确理解发送方的命令包. 接受方必须根据协议正确的从第一包数据中取出前 80 个字节. 作为一条命令, 再把剩下的 70 个字节和第二包的数据组合成第二条命令. 这个问题如此常见. 以致于实现一个可以复用的, 轻量级的解析器就变得很有必要. 于是就有了这个 PacketExtractor . PacketExtractor C++  实现, 运用分层的思想. 结合模板, 虚函数等技术. 让使用者只需要重载几个函数, 就可以完美的解决在通讯过程中的拆包, 组包的问题.

 

设计思路

PacketExtractor 的算法其实很朴素.

在收到一包数据之后, 先查找包头特征字(比如 7e), 一般的, 协议中都有一个包长字段. 将包头作为包的起始字节, 找到包长. 如果收到的包还不够包长指定的长度, 则将包放到一个缓冲区. 等下一包数据到的时候, 将这次的半包附加到收到数据前面. 递归调用处理函数. 如果收到的数据已经够一包的长度了. 则根据协议取出校验字段. 对包进行校验. 如果通过. 则证明是一个合法包.

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值