2012-02-27 32 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確實會發生而不是