2012-02-27 20 views
0

私はJavaを使って簡単なパケット解析ツールを開発することになっています。私はバイト・アレイとしてネットワーク・インターフェースからイーサネット・フレームをキャプチャできるラッパーを与えられています。Javaでネットワークパケット階層を作成する

現在、私はパケット階層を実装しようとしています。 src/dst MACアドレスとethertypeを格納するPacketクラスがあり、フレームの残りの内容を別のバイト配列に配置します。

私の質問は次のとおりです。この時点から、パケットを作成するために使用されたデータがイーサネットフレームの残りのデータであるIPPacketタイプの新しいオブジェクトを作成できるようにしたいと考えています。 IPバージョンの場合は4/6 ")。私は現在、ethertype(IPv4の場合は0x800)に基づいたisIPというブール値を設定しています。パケット・オブジェクトのための私のコンストラクタにおいて

、最後の行は、このメソッドへの呼び出しである:

ペイロードを剥離イーサネットフレームを含むバイト配列である
private void createPacket(){ 
     if(isIP == true) 
      new IPPacket(payload); 
     else if(isARP == true) 
      new ARPPacket(payload); 
    } 

このメソッドは正しく動作しません.IPPacketオブジェクトを処理しようとすると、配列内のバイトにアクセスしようとするとnullポインタ例外が発生するためです。

希望の結果を得るためのクリーンな方法はありますか?私は、単に私のパケット階層をカスケード接続することができますパケットオブジェクトを作成することができることを期待して適切なパケットサブタイプ(ARP、IP、TCP、UDP)のオブジェクトを作成し、ユーザーに表示されています。最終的に、IPPacketクラスは子クラスとしてTCPPacketとUDPPacketを持ちます。

ここにお手伝いいただければ幸いです。ありがとうございます!

+0

[Jpcap](http://netresearch.ics.uci.edu/kfujii/Jpcap/doc/)ではどうしますか? – aviad

+0

JPcapはオプションではありません。プロジェクトの割り当てでは「外部パッケージを使用できません」と明記されているためです。 – pj2889

答えて

1

createPacketメソッドでは、新しいIPPacketインスタンスまたは新しいARPPacketインスタンスを作成します。しかし、あなたはこれらのいずれかへの参照を保存しません。つまり、これらの新しいインスタンスはすぐにガベージコレクトできます。したがって、あなたがIPPacketまたはARPPacketにアクセスしようとする前に、プレイロードではなく、にアクセスしようとすると、NullPointerExceptionではなく、となると思います。

関連する問題