我使用TcpListener
接受&從TcpClient
中讀取。 問題是當從TcpClient
讀取時,TcpClient.BeginRead
/TcpClient.EndRead
不會在互聯網斷開連接時發生異常。只有當客戶端的進程結束或服務器或客戶端關閉連接時才拋出異常。當互聯網斷開連接時,TcpClient.BeginRead/TcpClient.EndRead不會引發異常
回答
系統通常沒有機會知道連接中斷。知道這個的唯一可靠的方法是嘗試發送一些東西。當你這樣做時,數據包被髮送,然後丟失或反彈,你的系統知道連接不再可用,並通過錯誤代碼或異常(取決於環境)將問題報告給你。讀取通常是不夠的,因爲讀取只會檢查輸入緩衝區的狀態,並不會將數據包發送到遠程端。
據我所知,在這種情況下,低級套接字不會通知您。您應該提供自己的超時實現或定期ping服務器。
我不認爲你會希望BeginRead和EndRead拋出異常,因爲這些應該在多線程場景中使用。
您可能需要實現一些其他機制來響應丟棄連接。
如果您想知道網絡狀態何時更改,您可以訂閱System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged
事件。這不是特定於互聯網,只是本地網絡。
編輯
對不起,我誤會了。 「連接」的概念實際上並不存在你對它的更多想法。 This post在進入更多細節方面做得很好。有一個Connected
財產上的TcpClient
但MSDN說(重點煤礦):
,因爲連接的屬性只 體現爲最近操作的連接 的狀態,你 應該嘗試發送或接收一個 消息來確定當前的 狀態。消息發送失敗後, 此屬性不再返回true。 請注意,此行爲是設計。 您無法可靠地測試 連接的狀態,因爲在測試和發送/接收之間的時間爲 ,連接可能已經丟失。 你的代碼應該假設連接的套接字是 ,並優雅地處理 失敗的傳輸。
基本上只有這樣,才能檢查客戶端連接它來嘗試發送數據。如果它通過,你連接。如果失敗了,你不是。
但我是服務器,並且當客戶端從互聯網斷開,我無法檢查它的網絡狀態。 – 2011-02-01 18:44:43
- 1. 當互聯網連接或斷開連接時收到通知
- 2. SignalR斷開連接不會被調用互聯網上斷開/重新連接
- 3. Android InputStream互聯網斷開連接
- 4. 互聯網連接異常失敗
- 5. 當數據庫連接失敗時,Hibernate不會引發異常
- 6. signalR stateChanged不會被調用互聯網上斷開連接/重新連接
- 7. 不斷檢查互聯網連接
- 8. 不斷檢測互聯網連接
- 9. ASP.NET開發沒有互聯網連接
- 10. 檢查互聯網連接或不斷檢查互聯網連接
- 11. 打開互聯網連接
- 12. 當互聯網連接丟失時,MySQL連接會發生什麼?
- 13. 如何通知互聯網連接斷開,但WiFi仍連接
- 14. 檢查互聯網連接或發現異常?
- 15. ObjectInputStream.readObject()在斷開連接時不會拋出異常
- 16. 在android中連接到互聯網時出現異常
- 17. Socket.IO切斷互聯網連接
- 18. 互聯網連接/斷開連接時是否存在Windows掛鉤?
- 19. 如何檢測套接字異常時,互聯網連接不存在
- 20. 改造不斷重試時,互聯網是沒有連接
- 21. 互聯網連接
- 22. 配對和連接設備關閉時不會引發異常
- 23. 當遠程主機關閉連接時,Socket Send方法不會引發異常
- 24. 互聯網提交請求後連接斷開
- 25. 離子CLI與互聯網連接斷開
- 26. 如何處理互聯網連接斷開時的支付網關
- 27. 當機器非常活躍時,RabbitMQ/EasyNetQ會斷開連接嗎?
- 28. 如果用戶與互聯網斷開連接,Firebase會更新Firebase上的值
- 29. 當互聯網連接不可用時,應用程序崩潰
- 30. 延遲時間viewWillAppear和viewDidAppear當互聯網連接不好
我不能ping,因爲我是服務器:( – 2011-02-01 18:48:43