2010-12-19 3 views
0

J'utilise TCP socket connetion entre un programme serveur et un programme client. Les programmes client multiples doivent se connecter au même port. Le problème est que si je ferme un programme client je reçois l'erreur suivante sur le serveur-programme:Comment gérer correctement une connexion TCP perturbée?

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

Si je gère cela par un try/catch, je suis donc pas en mesure de re -connect avec le client-programme, car il donne l'erreur suivante (dans le programme client):

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

est sous le code d'écoute dans le programme du serveur. J'espère obtenir de l'aide pour comprendre comment je peux gérer l'arrêt du programme client/redémarrer & sans le programme Reconnect de serveur défaillant ..

' 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 

Répondre

1

Vous n'avez pas. Tu es le serveur. Vous fermez le socket et l'oubliez. Si le client veut plus de service, c'est à lui de se reconnecter.

+0

Merci! Voulez-vous dire que cette erreur est ensuite correctement gérée par le try/catch en l'état, et je ne devrais pas améliorer cette logique? Dans ce cas cependant, il doit toujours y avoir quelque chose qui me manque, car je ne suis pas capable de me connecter lorsque je redémarre le client .. Comme il est dit "machine cible activement refusée ..." – bretddog

+0

hmm. Je ne sais pas ce que j'ai changé mais semble fonctionner maintenant. – bretddog

Questions connexes