3

非同期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でクライアントを削除し、メソッドを再スローしました。むしろより良い方法だろう。

4

2 に答える 2

2

例外方法です。切断された接続について通知するTCPAPIまたはコールバックはありません。調べるには、読み取りまたは書き込みを行う必要があります。これは、信頼性の理由からTCPの奥深くで設計されました。

于 2012-08-13T00:27:25.313 に答える
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
    }
于 2012-08-13T01:11:22.463 に答える