Ich versuche alle Daten zu lesen, die im Puffer der Maschine vorhanden sind, die durch TCP/IP
verbunden sind, aber ich weiß nicht, warum ich nicht alle Daten bekomme, einige Daten werden verpasst.
Hier ist der Code, den ich verwende ..
Bitte sagen Sie mir, was ich vermisse, um alle Daten von der Maschine zu bekommen. Vielen Dank im Voraus ..
Das Problem mit Ihrem Code ist, dass Sie nicht alle Daten erhalten, wenn die Datengröße größer ist als die Puffergröße (1024 Bytes in Ihrem Fall), so dass Sie den Stream innerhalb der Schleife lesen müssen. Dann können Sie Write
alle Daten in einem MemoryStream
bis zum Ende von NetworkStream
.
Dieses Beispiel von MSDN: NetworkStream .DataAvailable zeigt, wie Sie diese Eigenschaft verwenden können:
%Vor%Probieren Sie diesen Code:
%Vor%Hoffentlich hilft das, es sollte verhindern, dass Sie irgendwelche Daten verpassen, die Ihnen gesendet wurden.
TCP selbst hat keine Möglichkeit, die Bedingung "Ende der Daten" zu definieren. Dies ist die Verantwortung des Portlets auf Anwendungsebene.
Siehe zum Beispiel HTTP Anfrage Beschreibung:
Auf eine Client-Anfrage (bestehend aus der Anfragezeile und nur einem Header-Feld) folgt eine Leerzeile, so dass die Anfrage mit einem doppelten Zeilenumbruch endet
Also, für die Anfrage wird das Ende der Daten durch zwei Zeilenfolgen bestimmt. Und für die Antwort:
Content-Type gibt den Internet-Medientyp der Daten an, die von der HTTP-Nachricht übermittelt werden, während Content-Length die Länge in Byte angibt.
Die Größe des Antwort-Inhalts wird im Header vor den Daten angegeben. Es liegt also an Ihnen, die Menge der übertragenen Daten auf einmal zu kodieren - es können nur die ersten 2 oder 4 Bytes am Anfang der Daten sein, die die Gesamtgröße enthalten, um gelesen zu werden, oder komplexere Wege, falls erforderlich.
für mein Szenario gab die Nachricht selbst die Länge der nachfolgenden Nachricht an. Hier ist der Code
%Vor%Tags und Links c# tcp networkstream tcpclient tcp-ip