2012-02-28 45 views
1

我想分析的TCPPacket或UDPPacket我接收的數據包,但如果我寫「TCPPacket PAC3 =(TCPPacket)數據包;」對於使用UDP作爲傳輸層協議的數據包,然後我得到一個異常 「異常在線程‘主要’java.lang.ClassCastException:jpcap.packet.UDPPacket不能轉換到jpcap.packet.TCPPacket」如何在java中使用jpcap來識別接收的數據包是使用TCP還是UDP?

如何我可以確定收到的數據包是使用TCP還是UDP? 其實我想從接收到的數據包中獲取端口號。

+0

跟進,因爲你正在尋找的端口,在TCP和UDP,標題的前16位(而不是IP頭,但TCP/UDP報頭)是源端口和下一目標端口是16位。你應該可以使用它,而不必關心它是TCP還是UDP。 – corsiKa 2012-07-25 15:00:45

回答

1

答案很明顯,你的問題是使用instanceof操作:

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

但是,這是一個有點臭。我不知道JPCAP API,但我會看看是否有任何API調用可以用來詢問它的類型。或者,也許你可以設置兩種不同的機制(通道,套接字,回調???)分別接收UDP和TCP,這樣你就知道它們的區別了嗎?

0

可能是你可以使用instanceof運算符在Java中,以確定數據包的類型。

0

它看起來像有沒有一種方法,基於API,你可以調用。如果存在,它將位於數據包的父類別上,which is found here.

通常,這種類型的事情將在流中處理,其中您有一個TCP流或一個UDP流。但不幸的是你沒有。

您應該可以依靠instanceof,但顯然API依賴優於instanceof

另一種選擇是使用header()方法。看起來協議存儲在你應該有權訪問的IP標頭中。 This page似乎是爲了說明IP頭,而這6將是TCP的協議號,其中17是UDP。

事實上,常量jpcap.Packet.IPPROTO_TCPjpcap.Packet.IPPROTO_UDP可能映射到這些值。所以看起來最好的辦法是解析頭文件。

相關問題