2011-05-01 194 views
2

我有一個聊天網站(http://www.pitput.com),它通過套接字連接連接用戶。 我在客戶端有一個Flash對象,它打開到我服務器端口的連接。 在服務器中,我有一個服務在異步事件中監聽該端口。Tcp socket突然關閉連接

所有工作正常,除非我在一段未知的時間(約幾分鐘)後與某人說話服務器正在關閉我的連接,並且在服務器中出現錯誤: 「連接嘗試失敗,因爲連接一方在一段時間後沒有正確響應,或者由於連接的主機未能響應而建立連接失敗「。

我不知道tcp套接字是如何工作的。它是否每隔幾秒檢查一次「實時」連接?它如何決定什麼時候關閉連接?我很確定,關閉操作不是來自客戶端。

謝謝。

+0

每次你停頓幾分鐘,或者有時候,這種情況會發生嗎? – 2011-05-02 03:16:25

回答

0

這是一個ASP Web服務託管與某些公司?如果是這樣,服務器通常每10到20分鐘回收應用程序。你不能無限期地運行web服務,除非它是你自己的服務器(我相信)。

1

聽起來像服務器正在處理連接但沒有響應。這是我通常拿出WireShark找出發生了什麼的點。

1

TCP/IP確實有檢查活動連接的選項;它被稱爲「Keepalive」。 Keepalives幾乎沒有用過。它們並未默認啓用。可以通過調整註冊表來在系統範圍內啓用它們,但IIRC最低超時時間爲1小時。它們也可以在單個套接字上啓用(在幾分鐘內超時),但是您會知道您的應用程序是否執行此操作。

如果您使用的是Web服務和客戶端連接到一個HTTP/HTTPS端口,則可以得到由HTTP服務器(通常的空閒時間兩分鐘後關閉它們的連接)關閉。在一段空閒時間後,中間路由器可能會以您的名義關閉它(這不是默認行爲,但公司路由器有時配置了這種「有用的」設置)。

如果使用Win32服務,則它實際上聲如客戶端側被丟棄連接或失去它們的網絡(例如,移動無線路由器的範圍之外)。在後一種情況下,客戶可能仍然不知道連接已關閉(這種情況稱爲"half-open");服務器看到關閉,但客戶端認爲連接仍在。