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.
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.
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.
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:
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.
Tags und Links c# sockets networkstream blocking