1

受信したパケットをTCPPacketまたはUDPPacketで解析したいのですが、「TCPPacket pac3 =(TCPPacket)packet;」と書くと トランスポート層プロトコルとしてUDPを使用しているパケットの場合、「スレッド「メイン」の例外java.lang.ClassCastException:jpcap.packet.UDPPacketをjpcap.packet.TCPPacketにキャストできません」という例外が発生します。

受信したパケットがTCPとUDPのどちらを使用しているかを確認するにはどうすればよいですか?実際、受信したパケットからポート番号を取得したいのですが。

4

3 に答える 3

1

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

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

しかし、それは少し臭いです。JPCAP APIはわかりませんが、パケットのタイプを確認するために実行できるAPI呼び出しがあるかどうかを確認します。または、UDPとTCPを別々に受信するように、2つの異なるメカニズム(チャネル、ソケット、コールバック???)を設定して、違いを理解することもできますか?

于 2012-02-28T18:31:41.907 に答える
0

Javaでinstanceof演算子を使用して、パケットのタイプを判別できる場合があります。

于 2012-02-28T18:32:43.060 に答える
0

APIに基づいて呼び出すことができるメソッドがないようです。存在する場合は、ここにあるパケットの親クラスにあります

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

に依存できるはずですがinstanceof、明らかにapiへの依存が優先されinstanceofます。

別のオプションは、header()メソッドを使用することです。プロトコルはIPヘッダーに保存されているようです。IPヘッダーにアクセスする必要があります。このページはIPヘッダーを示しているように見え、6はTCPのプロトコル番号であり、17はUDPです。

実際、定数jpcap.Packet.IPPROTO_TCPjpcap.Packet.IPPROTO_UDPおそらくそれらの値にマップされます。したがって、最善の策はヘッダーを解析することであるように見えます。

于 2012-02-28T18:32:59.383 に答える