我正在C#中開發一個服務器,它只能接受一個客戶端,我需要知道這個客戶端何時斷開連接才能接受另一個連接請求。在.NET中檢測客戶端斷開連接的最佳實踐?
我正在使用第一個Socket連續監聽與Socket.BeginAccept
的連接請求並接受或拒絕客戶端。當客戶端被接受時,由Socket.EndAccept
返回的新Socket被用於客戶端和服務器之間的通信。然後,服務器通過Socket.Begin/EndReceive
等待來自客戶端的命令併發送響應。服務器使用類似Telnet的協議,這意味着每個命令和每個響應行都必須以\r\n
結尾。
爲了檢測客戶端是否已斷開連接,我安裝了一個定時器,它每隔500毫秒向客戶端發送一條空消息(「\r\n
」)。如果客戶端斷開連接,Socket會引發異常。此異常由關閉當前會話並接受新連接的服務器捕獲。該解決方案是健壯的,但意味着不必要的網絡流量,並且必須由客戶端正確處理,客戶端必須在獲得實際響應之前過濾虛擬消息。
我試圖發送一個空的緩衝區(Socket.Send(new byte[1], 0, 0)
),但它似乎不適用於方向server-> client。
另一種解決方案可能是處理Socket.EndReceive
返回0字節的情況。它適用於在「空閒」時間發生斷開的情況。但是,如果客戶端在消息轉移期間斷開連接,服務器並不總是看到它並且無限期地等待。
我已經看到了關於這個問題的幾個線程和問題,但我從來沒有見過任何好的解決方案。
所以我的問題是:在.Net中檢測斷開連接的最佳方法是什麼?
好的,我已經添加了使KeepAlive適用於我的套接字的代碼。但是我現在期望的是什麼?當客戶端斷開連接時,什麼都不會發生......我希望在某處收到一個異常......我應該定期讀或寫一些東西嗎? – cedrou 2009-09-02 20:46:20
我雖然在使用Begin/EndReceive?如果是這樣,則BeginReceive應該運行回調,並且當您調用EndReceive來獲取結果時應該引發異常,或讀取流0字節的末尾。 – 2009-09-02 22:51:54
好吧,我現在得到一個異常...謝謝 – cedrou 2009-09-07 13:38:16