2012-02-27 80 views
0

我的任务是使用Java开发简单的数据包分析工具。我给了一个封装器,它允许我从网络接口捕获以字节数组形式的以太网帧。在Java中创建网络数据包分层结构

目前,我试图实现一个数据包层次结构。我有一个Packet类,它存储src/dst MAC地址和ethertype,然后将帧的其余内容放在一个单独的字节数组中。

我的问题是:从这一点来说,我希望能够创建一个新的对象,比如IPPacket类型,其中用于创建所述数据包的数据是来自以太网帧的剩余数据(以“ 4/6“为IP版本)。我目前正在通过设置一个名为isIP的布尔值(基于ethertype(针对IPv4的0x800))来做到这一点。

以我构造函数包对象,最后一行与当前方法的调用:

private void createPacket(){ 
     if(isIP == true) 
      new IPPacket(payload); 
     else if(isARP == true) 
      new ARPPacket(payload); 
    } 

其中有效载荷是含有经汽提的以太网帧的字节数组。

此方法工作不正常,因为当我尝试处理IPPacket对象时,在尝试访问数组内的字节时,我收到空指针异常。

有没有一种干净的方式来得到我想要的结果?我希望能够简单地创建可以级联我的数据包层次结构的Packet对象,创建相应数据包子类型(ARP,IP,TCP,UDP)的对象,然后显示给用户。最终,IPPacket类将TCPPacket和UDPPacket作为子类。

任何帮助在这里将不胜感激,谢谢!

+0

使用[Jpcap](http://netresearch.ics.uci.edu/kfujii/Jpcap/doc/)怎么办? – aviad 2012-02-27 08:03:40

+0

JPcap不是一个选项,因为项目分配明确指出“不可使用外部软件包”。 – pj2889 2012-02-27 14:47:58

回答

1

在您的createPacket方法中,您将创建一个新的IPPacket实例或新的ARPPacket实例。但是你不保存对这些任何一个的引用。这意味着,这些新实例可以立即被垃圾收集。因此,我认为,当您尝试访问播放负载但是时您尝试访问IPPacketARPPacket时,您的NullPointerException确实会发生而不是