2012-01-19 195 views
1

嘗試了一些檢測遠程套接字是否已斷開連接的不同方法。檢查套接字連接

我目前這樣做是爲了檢查套接字是否連接。

public void CheckSocket() 
{ 
    try 
    { 
     bool test1 = s.Poll(_MicrosecondFaultTolerance, SelectMode.SelectRead); 
     bool test2 = (s.Available == 0); 
     if (test1 && test2) 
      _Active = false; 
    } 
    catch 
    { 
     _Active = false; 
    } 
} 

這對於某些原因,所有的不問時間完美的作品的首次下降,但在此之後,檢查不設置_active爲false,因此客戶端從不認爲「斷開連接」。有沒有其他的方式可以測試一個連接或者有一個更可靠的結果。

+0

可能重複的[如何檢查一個套接字是否連接/斷開在C#?](http://stackoverflow.com/questions/2661764/how-to-check-if-a-socket-is-connected-斷開式-c)的 –

回答

2

我不確定「第一滴」是什麼意思,因爲一旦套接字下的連接被丟棄,套接字必須關閉。這一切都取決於你在CheckSocket()函數之外做什麼。但假設所有處理都正確,只要基礎連接空閒,簡單地輪詢套接字將無法可靠地工作。

只有在底層傳輸中存在一些流量時才能檢測到斷開連接。如果一個連接在閒置時被放棄(不關閉),它將永遠靜靜地坐在那裏。要在閒置時檢測廢棄連接,請使用setsockopt()SO_KEEPALIVE。 TCP將定期與另一端交換虛擬通信量,以測試連接是否仍然存在,並防止任何NAT或其他動態路由規則超時。請注意,檢測到丟失仍需要30秒或更多時間,因爲這是TCP的默認超時。