Как правильно обрабатывать нарушенное TCP-соединение? - PullRequest
0 голосов
/ 19 декабря 2010

Я использую соединение через сокет TCP между серверной программой и клиентской программой. Несколько клиентских программ должны подключаться к одному и тому же порту. Проблема в том, что если я закрываю клиентскую программу, я получаю следующую ошибку на серверной программе:

System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
   at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)
   at System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult)

http://i55.tinypic.com/nh135w.png

Если я обработаю это методом try / catch, я не смогу повторно соединиться с клиентской программой, так как она выдаст следующую ошибку (в клиентской программе):

No connection could be made because the target machine actively refused it 127.0.0.1: 1234

Ниже приведен код слушателя в программе сервера. Я надеюсь получить некоторую помощь, чтобы понять, как я могу справиться с завершением / перезапуском и повторным подключением клиентской программы без сбоя серверной программы ..

   ' This is the callback function for TcpClient.GetStream.Begin, It begins an asynchronous read from a stream.
    Private Sub DoRead(ByVal aread As IAsyncResult)
        Dim BytesRead As Integer
        Dim strMessage As String

        ' Try
        ' Ensure that no other threads try to use the stream at the same time.
        SyncLock _client.GetStream
            ' Finish asynchronous read into readBuffer and get number of bytes read.
            If Client.Connected Then
                BytesRead = _client.GetStream.EndRead(aread)
            End If
        End SyncLock

        ' Convert the byte array the message was saved into, minus one for the Chr(13) (carriage return).
        strMessage = Encoding.ASCII.GetString(readBuffer, 0, BytesRead - 1)
        ProcessIncoming(strMessage)

        ' Ensure that no other threads try to use the stream at the same time.

        SyncLock Client.GetStream
            ' Start a new asynchronous read into readBuffer.
            Client.GetStream.BeginRead(readBuffer, 0, READ_BUFFER_SIZE, AddressOf DoRead, Nothing)
        End SyncLock
        'Catch e As Exception
        '    ' This triggers if userlist is found empty
        '    ' Then gives problem, as it cant close the connection or something.. ??
        '    Debug.Print("UserConnection.DoRead Exception: " & e.ToString)
        '    CloseConnetion("Error: Stream Reciever Exception")

        'End Try

    End Sub

1 Ответ

1 голос
/ 20 декабря 2010

Ты не.Ты сервер.Вы закрываете розетку и забываете об этом.Если клиенту требуется больше услуг, он может восстановить соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...