【问题标题】:Correct way to detect a client has disconnected from TCP/IP检测客户端与 TCP/IP 断开连接的正确方法
【发布时间】:2012-08-13 09:11:22
【问题描述】:

我使用了异步 TCP/IP 服务器,一切正常,但是当客户端由于错误或应用程序强制退出而断开连接时,它也会由于 IO.IOException 类型的异常而关闭我的服务器。异常发生在以下子中:

   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

当客户端与我的 TCP 服务器断开连接时,以下代码会引发 IO.IOException:

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

其他然后捕获 IO.IOException 我如何才能防止它首先创建异常。基本上我想在这种情况发生时删除我的客户端,目前作为一种解决方法,我已经删除了 IO.IOException 上的客户端并重新抛出该方法。宁愿有更好的方法。

【问题讨论】:

  • client 是什么类型?大多数使用 socket 的类都有一个 connected 属性。检查客户端不为空后检查这是真的。如果它是假的,你已经断开连接
  • @SimonHalsey 不是这样。 isConnected() 和 isClosed() 方法只告诉你你对套接字做了什么,即你的端点。它们不会告诉您连接的状态,而且它们的行为与您刚才描述的不一样。
  • 你是对的。这是一个糟糕的词选择。我在考虑是否关闭连接,而不是远程关闭连接。

标签: c# vb.net asynchronous tcp tcpserver


【解决方案1】:

例外的方式。没有 TCP API 或回调可以告诉您连接断开的情况。你必须阅读或写作才能找到答案。出于可靠性原因,这是深入 TCP 设计的。

【讨论】:

    【解决方案2】:

    希望这会有所帮助:

    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
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 2014-01-24
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多