基于Pcap4j收发自定义协议报文(注意事项/踩坑总结)
大致内容:完善自定义的Cat21协议,补充至少5个数据类型不同的协议字段 用户输入Cat21协议字段,发送数据包 用户捕获Cat21数据包,打印输出字段值
本篇博客是直接将自定义协议报文封装在MAC帧的payload中的。
一、Cat21Packet类
1.添加自定义字段
2.在含有原来字段的函数增加新增字段的操作
以及添加相应获取数据的函数
如果新增数据段在Header,就在Header类中定义每个字段的大小和偏移量(如果是Payload就在Payload类中定义)注意字段大小一定要和字段类型占用大小一致,否则在解析时会出错!!!
以此类推在相应构造函数中添加新增变量,类型无法直接转换的需要单独写函数完成,例如:
二、Send类
1.将端口改为不容易冲突的,方便后面用过滤器抓特定的报文
2.由用户输入各字段信息
3.修改builder中相应的变量
三、CapPacket类
1.设置网卡过滤器,使用 BPF(Berkeley Packet Filter)语法来过滤捕获的数据包
2.反序列化自定义协议报文的时候,这里踩了一个坑,Cat21Packet中的构造函数有抛出异常,所以在用原始数据构造一个自定义协议对象的时候也要写异常的处理的方式,否则会报错
3.数据异常可以检查一下字节流中的数据是否对应的上,如有异常可能是字段长度偏移量问题
例:
本篇博客自定义协议字段类型(29bytes):
byte cat;
- byte 类型占用 1 字节short length;
- short 类型占用 2 字节int fspec;
- int 类型占用 4 字节byte sign;
- byte 类型占用 1 字节boolean judge;
- boolean 类型通常占用 1 字节(尽管在Java中它的大小没有明确指定,但通常实现为1字节)long i64;
- long 类型占用 8 字节float flt;
- float 类型占用 4 字节double dbl;
- double 类型占用 8 字节
解析结果
解析字段和输入一致则抓包解析成功