Ist das Lesen von einem Telnet-Stream in einen großen Byte-Array warten, bis das Byte-Array voll ist?

StackOverflow https://stackoverflow.com/questions/810963

  •  03-07-2019
  •  | 
  •  

Frage

Von ein paar Fragen und Antworten lesen hier, so scheint es, dass eine Telnet-Stream nie wirklich geschlossen wird. Mit DataAvailable () wird nicht zurückkehren.

Ich habe einige Code geerbt, die eine sehr lange Zeit gedauert hat, und wir dachten, es war der Telnet-Server, der das Problem war. Allerdings gibt es ein Byte [32757], die der Code die Antwort des Telnet-Server in speichern versucht.

So etwas wie folgt:

Byte byteArray[] = new Byte[32757];
TcpClient sock = new TcpClient();
sock.GetStream().read(byteArray, 0 byteArray.length);

Wenn es nicht 32.757 Bytes oder mehr ist, ich diesen Code gehe davon wartet, bis genug leere Pakete, die Größe des Byte-Array zu bilden, werden gesendet. Ist das richtig?

Gibt es eine Möglichkeit zu überprüfen, ob der Telnet-Server alles fertig ist das Senden sie will? Es gibt keine sichtbaren Abschluss Zeichen oder eine Zeichenkette in jeder ‚Seite‘ der Telnet-Sitzung.

ich einen Weg, dachte diesen Code zu korrigieren, ist ein paar Bytes zu einer Zeit, zu lesen, hinzufügen, dass in einen String, überprüfen Sie die Zeichenfolge für ein abschließendes Zeichen oder Zeichen gesetzt und zurück, wenn vorhanden. Andernfalls mehr Bytes lesen, hinzufügen, dass auf die Zeichenfolge, und klicken Sie hier.

Verbesserungsvorschläge?

War es hilfreich?

Lösung

Nein, Stream.Read im Allgemeinen nicht warten, bis es alles gelesen hat, und es ist sogar noch weniger wahrscheinlich für einen Netzwerk-Stream. Es wird gelesen, was Daten verfügbar sind, oder Block, bis es einige Daten zur Verfügung, aber das ist alles.

Es gibt kein wirkliches Konzept des Servers „Finishing“ sendet, was es geht zu senden, es sei denn:

  • a) es sagt Ihnen im Voraus, wie viel es senden geht
  • b) gibt es, wenn es mit irgendeiner Art von Abschlussdaten
  • fertig ist
  • c) schließt die Verbindung

Sie können einen Timer von einer Art verwenden möchten einen Effekt von „lesen Sie, bis einer der liest mehr als 5 Sekunden dauert“ zu erreichen. Beachten Sie, dass die Lese noch geschieht allerdings würden - Sie würden nur die Zeit wählen die Benutzeroberfläche zu aktualisieren (oder was auch immer). Es ist ein ziemlich heikeles Thema, und Sie müssen wirklich sein sehr klar in Ihrem eigenen Verstand (und docs!), Was Sie tun wollen, und welche Threads, was los zu behandeln.

Eine Alternative ist eine Lese Timeout auf dem TcpClient zu setzen, aber ich habe keine Erfahrung davon. Sie würden wahrscheinlich brauchen nur zu benutzen TcpClient.ReceiveTimeout und dann behandelt in geeigneter Weise die resultierende IOException beim Lesen, aber ich habe keinen Rat auf, es zu bieten.

Andere Tipps

Neben Jon Skeets Erklärung ein kleiner Tipp:

da telnet ein Text (Linie) basiertes Protokoll ist in der Byte-Lesung [] bedeutet, dass Sie zu finden, den Text wieder zusammenbauen. Sie werden mit einem Textreader besser dran:

System.IO.TextReader reader = new System.IO.StreamReader(
           sock.GetStream(), Encoding.ASCII);
string line;
while ((line = reader.ReadLine()) != null)  ...;

Ich vermute hier, dass Telnet-ASCII verwendet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top