2012-02-28 8 views
1

受信したパケットをTCPPacketまたはUDPPacketで解析したいのですが、 "TCPPacket pac3 =(TCPPacket)packet; 「:jpcap.packet.UDPPacket jpcap.packet.TCPPacketにキャストすることはできませんjava.lang.ClassCastExceptionが 『jpcapを使用して受信パケットがTCPまたはUDPを使用しているかどうかを確認する方法

どのようにトランスポート層プロトコルとしてUDPを使用しているパケットのために、私は例外 』スレッドの例外」メインを取得します受信したパケットがTCPまたはUDPを使用しているかどうかを確認できますか? 実際には、受信したパケットからポート番号を取得します。

+0

TCPとUDPの両方でポートを検索しているので、ヘッダーの最初の16ビット(IPヘッダーではなくTCP/UDPヘッダー)が送信元ポートであり、次の16ビットが宛先ポートです。 TCPまたはUDPの場合は気にせずに使用できます。 – corsiKa

答えて

1

あなたの質問に明白な答えはinstanceof演算子を使用することです:

if (packet instanceof TCPPacket) { 
    TCPPacket pac3 = (TCPPacket)packet; 
    // ... 
} 

をしかし、それは少し臭いです。私はJPCAP APIを知らないが、それがタイプのパケットを尋ねるためにあなたが作ることができるAPIコールがあるかどうかを見てみるだろう。または、UDPとTCPを別々に受信するために、2つの異なるメカニズム(チャンネル、ソケット、コールバックなど)を設定することができます。

0

javaのinstanceof演算子を使用してパケットのタイプを判別できますか。

0

apiに基づいて呼び出すことのできる方法はないようです。それがあった場合は、パケットの親クラスになります。which is found here.

通常、この種のものはTCPストリームまたはUDPストリームがあるストリームで処理されます。しかし、残念ながらあなたはそうしません。

あなたはinstanceofに頼ることができるはずですが、明らかにAPIの信頼度はinstanceofよりも優先されます。

もう1つの方法は、header()メソッドを使用することです。プロトコルはIPヘッダーに格納されているように見えますが、アクセスする必要があります。 This pageはIPヘッダーを示すように見え、6はTCPのプロトコル番号、17はUDPです。

実際、定数jpcap.Packet.IPPROTO_TCPjpcap.Packet.IPPROTO_UDPは、おそらくそれらの値にマップされます。だから、ヘッダーを解析するのが最善の策だと思われます。

関連する問題