2009-06-25 101 views
8

當Java創建一個Socket:如何查看/更改Linux上的套接字連接超時?

new Socket(host, port); 

插座的構造將嘗試連接到主機:端口返回之前。在Windows上,對於無法訪問的主機,這幾乎立即失敗,但對於Linux,Socket可能需要5分鐘才能超時。

我知道,如果我能控制的創建套接字,我可以這樣做:

Socket s = new Socket(); 
s.bind(..); 
s.connect(.., timeout); 

,但我寧願操作系統中使用合理的默認值。有沒有辦法在Linux上更改此設置?

感謝

+0

我認爲最好在每個應用程序的基礎上配置此超時。 否則,此機器中運行的所有其他應用程序都將受此設置的影響。 – Reginaldo 2009-06-25 20:31:34

+1

同意,我仍然想知道什麼設置是我應該改變它。 – Kevin 2009-06-25 20:39:22

+1

如果你堅持改變操作系統設置,那麼我認爲這不再是一個編程相關的問題,屬於服務器故障。 – akarnokd 2009-06-25 22:28:24

回答

7

我想你想/proc/sys/net/ipv4/tcp_syn_retries。默認值通常是5或6,大約3分鐘。

請注意,這些是系統範圍的。

0

這是我的理解是,這取決於系統的TCP/IP默認的超時時間(240秒默認?)......一個選項是嘗試調整的,但是這可能會影響到任何其他程序同一臺機器依賴超時值。在這種情況下,簡單地降低Java connect()調用中的「超時」值可能會更安全。

4

我會建議不要更改操作系統設置,因爲它可能會影響其他應用程序意外。 Socket.setSoTimeout()方法也可以幫助你。

2

這是BTW不完全正確,Linux和Windows在這裏的行爲不同。除了最初的SYN重試(可以在Linux和Windows上配置)之外,鄰居狀態以及發送RST數據包的其他路由器也發揮作用。

如果Windows上的連接嘗試立即失敗,則很可能是路由器RST更強烈,或者ARP級別上的鄰居被認爲無法訪問。在Windows上嘗試使用arp -a -v命令查看無法訪問的主機 - 這些主機會很快被拒絕。

對於Linux,您將使用ip neigh列出本地網絡上工作站的可訪問性狀態。