2013-01-08 23 views
0

如何區分使用java發送到互聯網之前的TCP和UDP數據包?我需要監聽這些數據包並區分它是TCP還是UDP。如何使用Java代碼實現這一點?如何區分帶有java代碼的機器中的TCP和UDP數據包?

更新: 我需要將所有TCP/IP和UDP數據包重定向到服務器(Ip),並且需要跟蹤TCP/IP和UDP數據包的流量並創建日誌。

回答

3

你不能在Java中看到使用TCP的單個數據包,但是當你使用Socket時,它將是TCP,如果你使用的是DatagramSocket,它將是UDP。即班級是不同的,所以你不會混淆它們。

如果您想窺探網絡適配器以查看哪些類型的數據包正在發送,可以使用JPCap。

+0

感謝您的回答。我需要將所有TCP/IP和UDP數據包重定向到服務器(Ip),並且需要跟蹤TCP/IP和UDP數據包的流量並製作日誌。 – 2vision2

+0

在這種情況下,您應該讓服務器記錄它發送和接收的所有數據。試圖從外部做到這一點很棘手,我不會建議你這樣做,除非你有多年的網絡編程經驗,即你必須使用本地庫並自己編寫代碼分配。 –

2

如果您正在偵聽套接字上的數據包,則需要指定套接字類型。

java.net.DatagramSocket for UDP,and java.net.Socket for TCP,所以你會一直知道你得到什麼類型的數據包。或者您是否希望嗅探流量並區分這種方式。

+0

感謝您的回答。我需要將所有TCP/IP和UDP數據包重定向到服務器(Ip),並且需要跟蹤TCP/IP和UDP數據包的流量並製作日誌。 – 2vision2

+0

那麼你需要運行混雜的,以便能夠聽到所有的流量,正如@peter lawrey所說的,如果你需要實時地使用jpcap之類的東西。 – Doon

1

如果你可以讀取ip包頭信息,你可以完成它。 在ip包頭中包含下一個協議號(6表示TCP,17表示UDP),您應該使用它來區分。

+0

感謝您的回覆。但是如果我讀取每個數據包,它會降低性能。 – 2vision2

+0

它取決於您的硬件。如果你的機器是交換機或路由器,這是一塊蛋糕。否則,如果你的PC或服務器,如你所說,它會降低性能,而不是不讀取每個pkt進程。我以前的工作是測試人員關於網絡產品,我不知道任何其他方式來解決您的問題,對不起。 – Bo6Bear

+1

@ 2vision2 - 你真的想過你的要求嗎?由於您已經明確要求記錄每個數據包,因此如果您閱讀每個數據包,它會降低性能。你期望如何在不閱讀它們的情況下登錄它們? – parsifal