C#中判斷socket是否已斷開的方法

轉載自 http://www.cnblogs.com/JLL/archive/2008/07/28/203090.html

 

記得以前Delphi/BCB裏的socket編程,要判斷[連接的另一方]是否斷開了,只要在ondisconnect事件裏處理就行了!如今在C#中,這個問題的確還是個問題哦!
       首先,Socket類的Connected屬性只表示最後一次I/O操作的狀態,如果這之後[連接的另一方]斷開了,它還一直返回true, 除非你再通過socket來發送數據。所以通過個屬性來判斷是行不通的!
       有人說可以用Socket.Available屬性來判斷,msdn中說:如果[連接的另一方]斷開了,它就會拋出異常。然而,這個BUG報告(http://dam.mellis.org/2004/08/net_socket_bugs_gotchas/)卻指出:msdn的說法並不完全正確,這個屬性只有在少數情況下才拋出異常。所以,這一招還是行不通!
       事實上,Socket.Receive()方法在[連接的另一方]斷開時,它返回結果告知只讀了0個字節,我們可以籍由這一點來找出答案。這個問答(http://www.dotnet247.com/247reference/msgs/36/182526.aspx)給出了好的解決方案:可以調用Socket.Poll() 方法,爲該方法的第二個參數傳入SelectRead 值,如果該方法返回true,  則可以再由Socket.Receive()方法的返回值來判斷, 我簡要的寫出代碼:

如果您還有更好的方法,也請告訴我, :).

發佈了14 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章