我有一個衆所周知的TCP端口上的服務器連接到一羣客戶端。客戶端使用非阻塞選項連接到服務器。TCP CLOSE_WAIT狀態..&新連接
當我殺死服務器進程時,客戶端套接字進入CLOSE_WAIT狀態。現在,如果我重新啓動服務器進程並嘗試再次連接客戶端,connect()調用似乎會阻止,即使它應該是非阻塞的。
實際的修復可能實際上是關閉套接字時服務器死亡。但我試圖瞭解當前的行爲..
- 當一個現有的連接在CLOSE_WAIT什麼是阻止建立新的連接?
- 爲什麼連接阻塞即使是非阻塞選項設置?
這被認爲是在Linux內核2.6.3x ..
2.6.3x內核沒有多大意義。 2.6.30和2.6.38之間有相當大的差異。將內核升級到3.0.0或3.1.0可能會有所幫助。 – 2012-01-12 01:42:50
你在使用'SO_REUSEADDR'嗎?請參閱http://stackoverflow.com/questions/775638/using-so-reuseaddr-what-happens-to-previously-open-socket – 2012-01-12 01:46:12
@BasileStarynkevitch 2.6.3x是足夠的信息爲這個問題。這似乎是一個基本的TCP/IP行爲,不可能經常改變。實際版本是2.6.32。不,我不打算嘗試3.0.0的假設,行爲可能會在3.0.0 – Manohar 2012-01-12 01:47:47