2013-02-11 56 views
0

我有套接字問題。我在我的電腦和手機之間創建了一個用於發送消息的套接字。當我關閉服務器或客戶端時,它會發送一個FIN數據包,並且它會一分鐘保持在FIN_WAIT2狀態。然而,另一方卡住在CLOSE_WAIT狀態,顯然不能關閉插座。我認爲套接字應該立即關閉,所以也許我應該在客戶端實現一個代碼,當服務器關閉套接字時關閉套接字,反之亦然。我怎樣才能做到這一點?爲什麼套接字的另一側沒有關閉套接字? (CLOSE_WAIT)?

回答

2

您需要關閉套接字通道的兩端。

如果服務器關閉到客戶端的連接,客戶端需要關閉客戶端上的連接,以便傳輸最後一個FIN數據包(從客戶端到服務器)。這將觸發TCP state machine中的最後一個狀態轉換。

+0

謝謝,但我不知道如何實現代碼來關閉客戶端連接。當我關閉服務器時,它會自動關閉其側面的插槽。我應該測試一些條件還是在客戶端捕獲一些異常,並在出現問題時關閉套接字?這將是實現這一目標的方式嗎? – cracq 2013-02-11 13:37:14

+2

@cracq當套接字的遠端關閉時,本地端變爲可讀,並且隨後的讀操作將以零長度讀取返回。這意味着套接字已經很好地從遠端關閉,並且你應該關閉你的端點。 – 2013-02-11 13:38:42

0

CLOSE_WAIT表示對等方已發送FIN,並且TCP正在等待本地應用程序關閉套接字。請參閱RFC 793.它不會自動發生。