1. 程式人生 > >C#中判斷socket是否已斷開的方法

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



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

       記得以前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()方法的返回值來判斷, 我簡要的寫出程式碼:
        
Socket s  =   new  Socket(..);
if  (s.Poll( - 1 , SelectMode.SelectRead))
{
   
int nRead = s.Receive();
   
if (nRead == 0)
   
{
     
//socket連線已斷開
   }

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