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



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

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

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

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

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

其中有效载荷是包含剥离的以太网帧的字节阵列。

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

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

如有任何帮助,我们将不胜感激,谢谢!

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

最新更新