在Java中创建网络数据包层次结构

时间:2012-02-27 03:56:59

标签: java networking inheritance packet-capture packet-sniffers

我的任务是使用Java开发一个简单的数据包分析工具。我给了一个包装器,允许我从网络接口捕获以太网帧作为字节数组。

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

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

在我的Packet对象的构造函数中,最后一行是对此方法的调用:

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

其中payload是包含剥离的以太网帧的字节数组。

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

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

非常感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

createPacket方法中,您可以创建新的IPPacket实例或新的ARPPacket实例。但是你不保存对其中任何一个的引用。这意味着,这些新实例可以立即进行垃圾回收。因此,我认为,当您尝试访问playload 之前,当您尝试访问NullPointerException或{时,IPPacket会发生 {1}}。