Jnetpcap 官方样例 (7)- 遍历pcap并输出数据包header信息

来源:互联网 发布:c语言字符串 编辑:程序博客网 时间:2024/06/05 08:00

这个例子打开一个捕获包的文件作为源,遍历所有数据包。这个例子同时演示了如何创建一个包含了关联数据包和头部数据的 PcaPacket 对象。libpcap提供的header和data都存储再libpcap私有的内存缓存中,每次迭代都会被重写。

public static void main(String[] args) {          final String FILE_NAME = "tests/test-l2tp.pcap";          StringBuilder errbuf = new StringBuilder(); // For any error msgs          /***************************************************************************          * 打开文件         **************************************************************************/          Pcap pcap = Pcap.openOffline(FILE_NAME, errbuf);          if (pcap == null) {              System.err.printf("Error while opening file for capture: "                  + errbuf.toString());              return;          }          /***************************************************************************          *创建一些再loop中会使用和重用的对象         **************************************************************************/          Ip4 ip = new Ip4();          Ethernet eth = new Ethernet();          PcapHeader hdr = new PcapHeader(JMemory.POINTER);          JBuffer buf = new JBuffer(JMemory.POINTER);          /***************************************************************************          * 我们必须将pcap’s data-link-type 映射到 jnetPcap‘s 协议id,scanner需要这个id数据用来判断packet的第一个header是什么         **************************************************************************/          int id = JRegistry.mapDLTToId(pcap.datalink());          // JRegistry 是协议的注册表,包括它们的类,运行时id,和相关的绑定,这个全局的注册表包括 绑定表,header scanner表和每个header的数字化id表。同时也提供一些查找和转化功能,比如吧header class 映射为 数字化id        /***************************************************************************          * 我们同步header 和 buffer 不是copy的,而是如同指针的         **************************************************************************/          while (pcap.nextEx(hdr, buf) == Pcap.NEXT_EX_OK) {              /*************************************************************************              * 我们吧header和buffer复制(指向)到新的packet对象中             ************************************************************************/              PcapPacket packet = new PcapPacket(hdr, buf);              /*************************************************************************              * 扫描packet             ************************************************************************/              packet.scan(id);              /*              * 使用 格式化工具吧源数据变为容易看懂的数据             */              if (packet.hasHeader(eth)) {  // 如果packet有ether头部                String str = FormatUtils.mac(eth.source());                  System.out.printf("#%d: eth.src=%s\n", packet.getFrameNumber(), str);              }              if (packet.hasHeader(ip)) {  // 如果packet有ip头部                String str = FormatUtils.ip(ip.source());                  System.out.printf("#%d: ip.src=%s\n", packet.getFrameNumber(), str);                  // getFrameNumber()是帧号            }          }          /*************************************************************************          * 关闭pcap         ************************************************************************/          pcap.close();      }  
0 0
原创粉丝点击