2012-08-12 127 views
3

我使用了異步TCP/IP服務器,一切正常,但當客戶端由於錯誤或應用程序強制退出而斷開連接時,它也會關閉我的服務器,異常的類型IO.IOException。在下面的子發生異常:檢測客戶端的正確方法已從TCP/IP斷開

Private Sub ReadCallback(ByVal result As IAsyncResult) 
     Try 


      Dim client As Client = TryCast(result.AsyncState, Client) 
      If client Is Nothing Then 
       Return 
      End If 
      'MsgBox(client.ClientID) 
      Dim networkStream As NetworkStream = client.NetworkStream 
      Dim read As Integer = networkStream.EndRead(result) **' ERRORS HERE!** 
      If read = 0 Then 
      Dim client As Client = TryCast(result.AsyncState, Client) 
      SyncLock Me.Clients 
       Me.Clients.Remove(Client.ClientID) 
       Return 
      End SyncLock 
      End If 

下面的代碼拋出IO.IOException當客戶端從我的TCP服務器斷開連接:

Dim read As Integer = networkStream.EndRead(result) **' ERRORS HERE!** 

其他然後捕捉IO.IOException我怎麼能防止這首先從創建例外開始。基本上我想在這種情況發生時刪除我的客戶端,目前作爲一種解決方法,我已經刪除了IO.IOException中的客戶端並重新拋出了該方法。寧可更好的方法。

+0

是什麼類型'client'?大多數使用套接字的類都具有連接屬性。檢查客戶端不爲空後檢查是否爲真。如果它是假的,你已經斷開 – 2012-08-12 14:49:22

+0

@SimonHalsey不是。 isConnected()和isClosed()方法只告訴你你對套接字做了什麼,即你的端點。他們沒有告訴你有關連接的狀態,而且他們沒有像剛剛描述的那樣表現出來。 – EJP 2012-08-13 00:28:49

+0

你是對的。這是一個糟糕的選擇。我正在考慮是否關閉了連接,而不是如果連接已關閉。 – 2012-08-14 16:49:15

回答

2

例外的方式。沒有TCP API或回調告訴你有關斷開的連接。你必須閱讀或寫信才能找到答案。出於可靠性原因,這是深入TCP設計的。

1

希望這有助於:

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    IAsyncResult result = socket.BeginConnect(_ip, Port, null, null); 
    bool success = result.AsyncWaitHandle.WaitOne(500, true); // 500 is milisecods to wait 
    if (socket.Connected && socket.IsBound && success) 
    { 
      // do your work       
    }else 
    { 
    // open a new connection or show your message to user 
    } 
相關問題