2010-12-20 44 views
0

我有一個客戶端服務器應用程序,我觀察到(在本地環境,即局域網),當我關閉連接客戶端到服務器一端的流,在另一端可觀察的(例如,如果在我的客戶端中關閉了將客戶端連接到服務器的流,而在另一端的服務器上,則這是顯而易見的,並且它被報告爲圍繞我的服務器流的try-catch塊中的Exception代碼)。流關閉時發送的信號

這怎麼可能?客戶端/服務器是否在關閉流之前發送特定的代碼,以便關閉流?它是否也適用於更廣泛的網絡(如大型廣域網)?

更大的問題是,當我關閉一端的流,我可以依靠的事實,在另一端它會被注意到,並因此關閉該線程,而不是等待無盡的接收數據,永遠不會是因爲該流被關閉了嗎?

客戶端和服務器之間的最大距離爲700公里(我不知道它是否發揮了作用,但我只是在案件提到)

謝謝!

回答

3

在TCP中,connection shutdown procedure當然需要向對方發送附加數據報,因此每一方都會注意到連接被有序關閉。

依賴於此有一個主要的缺陷:在無序關閉(例如網絡電纜的物理斷開)的情況下,不發送通知。 TCP中有一個「keepalive」功能,另一端將定期ping連接是否仍然存在,但由於ping的頻率非常低(小時數),所以這不太實際。如果「大多數」連接看到有序關閉(只要系統繼續運行,包括客戶端應用程序崩潰),則依靠關閉通知是合理的。爲了安全起見,服務器軟件通常會爲每個連接設置一個超時時間。

+0

如果我嘗試從我的客戶端發送數據,並且連接已關閉,但由於未知因素尚未通知我的客戶端已關閉連接,客戶端是否會收到錯誤消息發送沒有收到? – Alex 2010-12-20 11:33:24

+0

假設服務器計算機處於打開狀態,將數據發送到已關閉的連接時會出現「連接重置」錯誤消息。如果主機關閉,您可能會收到ICMP錯誤消息。如果消息根本沒有被確認,你的本地TCP堆棧會在一段時間後產生一個錯誤。 – 2010-12-20 12:58:09