Aus welchen Gründen würde NetworkStream.Read hängen bleiben / blockieren?

8

Die MSDN-Dokumentation scheint darauf hinzuweisen, dass NetworkStream.Read immer sofort zurückkehrt. Wenn keine Daten gefunden werden, gibt es 0 zurück. Ich habe jedoch einige Code, der derzeit bereitgestellt wird, dass nur in einigen Fällen (und ich habe noch nicht herausgefunden, welche) NetworkStream.Read scheint zu hängen. Hier ist der Stack-Trace, den ich aus einer Dump-Datei sammeln konnte

%Vor%

Ich stelle fest, dass das NetworkStrea.Read tatsächlich Socket.Receive aufruft, das so weit blockieren kann, wie ich es verstehe. Ich weiß einfach nicht, warum es manchmal blockieren würde und manchmal nicht.

    
Mark 05.08.2011, 14:52
quelle

4 Antworten

24

Der Hinweise Abschnitt der Dokumentation für NetworkStream.Read ist irreführend. Es sagt:

  

Diese Methode liest Daten in den Pufferparameter und gibt die Anzahl der erfolgreich gelesenen Bytes zurück. Wenn keine Daten zum Lesen verfügbar sind, gibt die Read-Methode 0 zurück. Die Leseoperation liest so viele Daten wie verfügbar aus, bis zur Anzahl der Bytes, die durch den Parameter size angegeben werden. Wenn der Remote-Host die Verbindung herunterfährt und alle verfügbaren Daten empfangen wurden, wird die Read-Methode sofort abgeschlossen und gibt null Byte zurück.

Es sollte sagen:

  

Diese Methode liest Daten in den Pufferparameter und gibt die Anzahl der erfolgreich gelesenen Bytes zurück. Wenn keine Daten zum Lesen verfügbar sind, blockiert die Read-Methode, bis Daten verfügbar sind oder die Verbindung geschlossen wird. Die Leseoperation liest so viele Daten wie möglich aus, bis zur Anzahl der durch die Größe angegebenen Bytes Parameter. Wenn der Remote-Host die Verbindung herunterfährt und alle verfügbaren Daten empfangen wurden, wird die Read-Methode sofort abgeschlossen und gibt null Byte zurück.

    
dtb 05.08.2011, 14:54
quelle
7

Manchmal befinden sich bereits Daten im Socket-Puffer, und manchmal wird dies auch nicht der Fall sein.

Ein häufiger Grund für einen NetworkStream -Block ist, wenn jede Seite der Verbindung erwartet, dass die andere schließt. Zum Beispiel, wenn Sie eine HTTP 1.1 Keep-Alive-Verbindung herstellen, aber immer noch den "Lesen, bis die Verbindung geschlossen ist" Weg, um Inhalt zu bekommen.

    
Jon Skeet 05.08.2011 14:54
quelle
1

Ein häufiger Fehler beim Umgang mit NetworkStream ist das Senden unvollendeter Befehle über Write method, was einen fortlaufenden Read -Aufruf verursacht.

Siehe das folgende Beispiel, das versucht, einen Benutzernamen an einen geöffneten FTP-Port zu senden. Es erwartet eine Antwort wie 331 Bitte geben Sie das Passwort an, aber die Read Methode hängt:

%Vor%

Eine magische Lösung besteht darin, die erste Zeile durch folgende zu ersetzen:

%Vor%

Wenn Sie am Ende des Befehls einfach \ r \ n hinzufügen, wird alles wie erwartet funktionieren.

    
Ryszard Dżegan 13.10.2015 10:38
quelle
0

Wenn keine Daten zum Lesen verfügbar sind, blockiert die Read-Methode, bis Daten verfügbar sind. Erwägen Sie, die Async-Socket-Funktionen zu verwenden, wenn Sie nicht blockieren möchten. Ссылка

    
Dave 05.08.2011 15:00
quelle

Tags und Links