2017-06-01 2 views
1

Wenn ich Daten von einer NetworkStream empfange, kann ich die stream.ReadTimeout konfigurieren.
Wenn innerhalb der konfigurierten Zeit keine Daten empfangen wurden, erhalte ich eine SocketException mit ex.SocketErrorCode=SocketError.TimedOut.Kann ich einen NetworkStream nach einer Ausnahme wegen eines Timeouts weiterhin verwenden?

Kann ich den Stream nach dieser Ausnahme weiterhin verwenden oder besteht die Möglichkeit, dass einige Bytes auf diese Weise verloren gehen?

Beispielcode:

using (TcpClient client = new TcpClient("127.0.0.1", 2000)) 
using (NetworkStream stream = client.GetStream()) 
using (StreamReader reader = new StreamReader(stream, Encoding.ASCII)) 
{ 
    stream.ReadTimeout = 5000; 

    while (true) 
    { 
     int i; 
     try 
     { 
      i = reader.Read(); 
     } 
     catch (IOException ex) 
     { 
      SocketError socketError = SocketError.Success; 
      if (ex.InnerException is SocketException) 
       socketError = ((SocketException)ex.InnerException).SocketErrorCode; 

      if (socketError == SocketError.TimedOut) 
      { 
       Console.WriteLine("no data received for 5 seconds"); 
       continue; 
      } 
      else throw; 
     } 
    } 
} 
+0

[Klicken Sie auf] (https://Stackoverflow.com/a/3575154/1997232). – Sinatr

+0

@Sinatr Ich glaube nicht, dass die Antwort, die du verlinkt hast, korrekt ist. Der TcpClient wird in meinen Tests überhaupt nicht getrennt, es funktioniert einwandfrei. Ich weiß nur nicht, ob dieser Ansatz sicher ist oder ob Bytes möglicherweise verloren gehen könnten. – HugoRune

Antwort

2

ich keine Dokumentation dieser auf .NET Seite gefunden habe, aber NetworkStream.ReadTimeout Anwendungen (Windows) setsockopt native Funktion und in der Beschreibung dieser Funktion und es ist es verschiedene Optionen klar gesagt wird (in der Beschreibung von SO_RCVTIMEO und SO_SNDTIMEO Fehlercodes):

Wenn ein Sende- oder Betriebszeiten auf einem Socket empfangen wird, wird der Sockel Zustand unbestimmt, und soll nicht sein benutzt; TCP-Sockets in diesem Zustand haben ein Potential für Datenverlust, da der Vorgang im selben Moment abgebrochen werden konnte, in dem der Vorgang abgeschlossen werden sollte.

Verwandte Themen