Q
QSmile
Unregistered / Unconfirmed
GUEST, unregistred user!
关于通讯协议的定义与封包解包处理技术的计论
在做通讯处理时通常要自己定义通讯协议.
近来正在做一个东东,也做了个协议.
协议定义如下:
(数据低位在前)
head cmd len Paramter CheckSum
开始头 命令 总长度 参数 CRC16 (前面所有字节)
word word word 可变0-4096 word (低位在前)
请求与回复都用相同的包结构. word 都是低位在前
回复时把 cmd 最高位置 1.
而实际使用时, cmd 最高四位用着它用. 这样也就 4096 个命令
参数部分的内容,根据 命令的不同而不同.
通讯程序中,封包都来得容易, 问题多在解包时
我已基本实现该协议, 与大家分析讨论一下
1.帧的定义比较完善. 有帧头, 总长度, 与 CRC ,能确认帧的完整性, 通讯中可能会错过一两个包,但不会因为错了几个包, 通讯完全中断
2. 粘包与断包的处理
这个问题相当的麻烦. 我发一个命令, 对方可能分别发N个回复. 而这几个回复,有时会粘到一起,分别回来我这里. 还有可能中间有几个包是个断开了的.分几次收到. 而且我的帧头也是两个字节的. 帧头本身也可能会被断开. 而且我的第5,6个字节才表示包的总长度.也就是说至少我要读到一个包的前6个字节,才能判断.
不知道这里有多少人在自己做通讯协议,
如果有我希望能看看你的协议框架是如何定义的, 也许有比我更好的方法, 大家讨论一下, 共同进步
在做通讯处理时通常要自己定义通讯协议.
近来正在做一个东东,也做了个协议.
协议定义如下:
(数据低位在前)
head cmd len Paramter CheckSum
开始头 命令 总长度 参数 CRC16 (前面所有字节)
word word word 可变0-4096 word (低位在前)
请求与回复都用相同的包结构. word 都是低位在前
回复时把 cmd 最高位置 1.
而实际使用时, cmd 最高四位用着它用. 这样也就 4096 个命令
参数部分的内容,根据 命令的不同而不同.
通讯程序中,封包都来得容易, 问题多在解包时
我已基本实现该协议, 与大家分析讨论一下
1.帧的定义比较完善. 有帧头, 总长度, 与 CRC ,能确认帧的完整性, 通讯中可能会错过一两个包,但不会因为错了几个包, 通讯完全中断
2. 粘包与断包的处理
这个问题相当的麻烦. 我发一个命令, 对方可能分别发N个回复. 而这几个回复,有时会粘到一起,分别回来我这里. 还有可能中间有几个包是个断开了的.分几次收到. 而且我的帧头也是两个字节的. 帧头本身也可能会被断开. 而且我的第5,6个字节才表示包的总长度.也就是说至少我要读到一个包的前6个字节,才能判断.
不知道这里有多少人在自己做通讯协议,
如果有我希望能看看你的协议框架是如何定义的, 也许有比我更好的方法, 大家讨论一下, 共同进步