2012-04-11 12 views
0

Ich habe einen Block von Code, der auf einem TCP-Port "überwacht" und sendet nur eine Zeichenfolge zurück, egal was gesendet wird. Das Problem ist, dass die Client-Seite nur prüft, ob der Port aktiv ist und dann getrennt wird. An diesem Punkt bekomme ich eine Fehlermeldung. kann nicht angeordnet Objekt Objektname Zugriff: ‚System.Net.Socket.NetworkSystem‘Geting Error ausgelöst, wenn TCP-Verbindung verloren

Ich denke, das Problem ist, dass dieser Code auf einem Gewinde ist und wenn die Verbindung schließt die while-Schleife ein angeordnete Objekt verweist ... Wie kann ich verhindern, dass der Fehler ausgelöst wird, wenn der Client die Verbindung schließt?

//Cretae listener to accept client connections 
     TcpClient tcpClient = (TcpClient)client; 
     NetworkStream clientStream = tcpClient.GetStream(); 

     byte[] rcvBuffer = new byte[BUFSIZE]; // Receive buffer 
     int bytesRcvd; // Received byte count 
     while (ServiceRunning) // Run forever, accepting and servicing connections 
     { 
      try 
      { 
       // Receive until client closes connection, indicated by 0 return value 
       int totalBytesEchoed = 0; 

//I THINK THIS IS WHERE THE PROBLEM IS .. THE CLIENTSTREAM.READ??? 

       while (((bytesRcvd = clientStream.Read(rcvBuffer, 0, rcvBuffer.Length)) > 0) && (ServiceRunning)) 
       { 
        clientStream.Write(responseBytes, 0, responseBytes.Length); 
        WriteEventToWindowsLog("GSSResponderService", "Received "+System.Text.Encoding.UTF8.GetString(rcvBuffer), System.Diagnostics.EventLogEntryType.Information); 
        totalBytesEchoed += bytesRcvd; 
       } 

       WriteEventToWindowsLog("GSSResponderService", "Responded to " + totalBytesEchoed.ToString() + " bytes.", System.Diagnostics.EventLogEntryType.Information); 


       // Close the stream and socket. We are done with this client! 
       clientStream.Close(); 
       tcpClient.Close(); 

      } 
      catch (Exception e) 
      { 
//THIS IS GETTING TRIGGERED WHEN A CONNECTION IS LOST 
       WriteEventToWindowsLog("GSSResponderService", "Error:" + e.Message, System.Diagnostics.EventLogEntryType.Error); 
       clientStream.Close(); 
       tcpClient.Close(); 
       break; 
      } 
     } 
    } 

Antwort

0

Laut MSDN, Read Methode der NetworkStream Klasse wirft IOException, wenn der zugrunde liegende Socket geschlossen und ObjectDisposedException wenn das Network geschlossen ist, oder es ist ein Fehler aus dem Netz zu lesen. Die gleichen Ausnahmen werden von Write Methode geworfen.

Daher sollte es genug sein, um diese 2 Ausnahmetypen zu erfassen und geeignete Maßnahmen in Ausnahmehandlern zu ergreifen.

TcpClient tcpClient = (TcpClient)client; 
    NetworkStream clientStream = tcpClient.GetStream(); 

    byte[] rcvBuffer = new byte[BUFSIZE]; // Receive buffer 
    int bytesRcvd; // Received byte count 
    while (ServiceRunning) // Run forever, accepting and servicing connections 
    { 
     try 
     { 
      // Receive until client closes connection, indicated by 0 return value 
      int totalBytesEchoed = 0; 

      try 
      { 
       while (((bytesRcvd = clientStream.Read(rcvBuffer, 0, rcvBuffer.Length)) > 0) && (ServiceRunning)) 
       { 
        clientStream.Write(responseBytes, 0, responseBytes.Length); 
        WriteEventToWindowsLog("GSSResponderService", "Received "+System.Text.Encoding.UTF8.GetString(rcvBuffer), System.Diagnostics.EventLogEntryType.Information); 
        totalBytesEchoed += bytesRcvd; 
       } 
      } 
      catch(IOException) 
      { 
       //HERE GOES CODE TO HANDLE CLIENT DISCONNECTION 
      } 
      catch(ObjectDisposedException) 
      { 
       //HERE GOES CODE TO HANDLE CLIENT DISCONNECTION 
      } 

      WriteEventToWindowsLog("GSSResponderService", "Responded to " + totalBytesEchoed.ToString() + " bytes.", System.Diagnostics.EventLogEntryType.Information); 


      // Close the stream and socket. We are done with this client! 
      clientStream.Close(); 
      tcpClient.Close(); 

     } 
     catch (Exception e) 
     { 
      WriteEventToWindowsLog("GSSResponderService", "Error:" + e.Message, System.Diagnostics.EventLogEntryType.Error); 
      clientStream.Close(); 
      tcpClient.Close(); 
      break; 
     } 
    } 
} 
Verwandte Themen