2012-05-21 34 views
4

我的目標是發送一個帶有空數據字段的TCP包,以便用遠程機器測試套接字。使用Java發送一個零數據TCP/IP包

我正在使用OutputStream類的寫入方法(byte [] b)。 我嘗試:

outClient = ClientSocket.getOutputStream(); 
outClient.write(("").getBytes()); 

這樣做,包從來沒有在電線上顯示出來。如果「」被替換爲「」或任何非零的字符串,它工作正常。

我試過jpcap,它與我一起工作,但沒有達到我的目標。 我想過擴展OutputStream類,並實現我自己的OutputStream.write方法。但這超出了我的理解。如果有人已經做過這樣的事,請給我建議。

+0

只是爲了好奇,你爲什麼要這麼做? –

+1

我正在開發TCP代理,並希望它能夠快速檢測靜默丟棄的連接以清理新連接。所以我認爲TCP Keepalive不會達到'快速'的目的。我希望你能幫助! – JoeAngel

+1

嗯,我有一種感覺,你會在這一個小河上。我不得不看看規範,但我敢打賭,沒有定義的行爲,這不僅意味着Java,而且即使硬件或硬件驅動程序也可能決定不發送「數據包」,因爲它在製造商中是空的自由裁量權。 –

回答

3

如果您只想快速檢測靜默丟棄的連接,則可以使用Socket.setKeepAlive(true)。此方法要求TCP/IP處理心跳探測,而無需任何數據包或應用程序編程。但是,如果您想要更好地控制心跳頻率,則應該使用應用程序級數據包實現心跳。

在這裏看到更多的細節:http://mindprod.com/jgloss/socket.html#DISCONNECT

+0

是的,我應該實施它。按順序發送零數據包將需要另一端的ACK,這可以幫助我知道連接是否仍在工作。零數據,因此不需要修改遠程主機。 – JoeAngel

+0

您鏈接的網站是錯誤信息的臭名昭着的來源,更糟的是他不接受更正。我試過了。例如:「我發現Java的連接連續性測試不足100%可靠」。 Java *根本沒有任何連續性測試:*它由操作系統的TCP堆棧完成。我在八年前告訴了他所有這些。 – EJP

-2

有沒有這樣的事,作爲一個空的TCP數據包,因爲沒有這樣的東西作爲一個TCP數據包。 TCP是一種字節流協議。如果你發送零字節,沒有任何反應。

要檢測連接斷開,保持活動狀態不足,它只能在兩小時後幫助您,您必須依賴讀取超時和寫入例外。

+1

我說零數據包,在問題描述中。有可能發送這樣的數據包,我使用一個名爲jpcap的特殊軟件包。遠程主機承認它。那麼,爲什麼你說沒有這樣的事情? 我想做同樣的事情,但使用JDK本身(沒有jpcap)。你知不知道怎麼? – JoeAngel

+0

@JoeAngel通過寫(「」)沒有這樣的事情。getBytes(),OK?當然,還有SYN,ACK,RST和FIN數據包,以及TCP keepalive通過發送帶有錯誤序列號的ACK參與的詭計。還有一種叫'JPcap'的軟件包。坦率地說,我的回答僅限於理智的界限。 – EJP

+0

NB在你的問題中沒有關於JPcap的內容,但是有關'write((「」)。getBytes())',這就是我的回答。 – EJP