2012-08-12 79 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 
    } 
相关问题