2011-02-01 117 views

回答

1

系統通常沒有機會知道連接中斷。知道這個的唯一可靠的方法是嘗試發送一些東西。當你這樣做時,數據包被髮送,然後丟失或反彈,你的系統知道連接不再可用,並通過錯誤代碼或異常(取決於環境)將問題報告給你。讀取通常是不夠的,因爲讀取只會檢查輸入緩衝區的狀態,並不會將數據包發送到遠程端。

1

據我所知,在這種情況下,低級套接字不會通知您。您應該提供自己的超時實現或定期ping服務器。

+0

我不能ping,因爲我是服務器:( – 2011-02-01 18:48:43

0

我不認爲你會希望BeginRead和EndRead拋出異常,因爲這些應該在多線程場景中使用。

您可能需要實現一些其他機制來響應丟棄連接。

1

如果您想知道網絡狀態何時更改,您可以訂閱System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged事件。這不是特定於互聯網,只是本地網絡。

編輯

對不起,我誤會了。 「連接」的概念實際上並不存在你對它的更多想法。 This post在進入更多細節方面做得很好。有一個Connected財產上的TcpClient但MSDN說(重點煤礦):

,因爲連接的屬性只 體現爲最近操作的連接 的狀態,你 應該嘗試發送或接收一個 消息來確定當前的 狀態。消息發送失敗後, 此屬性不再返回true。 請注意,此行爲是設計。 您無法可靠地測試 連接的狀態,因爲在測試和發送/接收之間的時間爲 ,連接可能已經丟失。 你的代碼應該假設連接的套接字是 ,並優雅地處理 失敗的傳輸。

基本上只有這樣,才能檢查客戶端連接它來嘗試發送數據。如果它通過,你連接。如果失敗了,你不是。

+0

但我是服務器,並且當客戶端從互聯網斷開,我無法檢查它的網絡狀態。 – 2011-02-01 18:44:43

相關問題