2009-03-30 4 views
1

Ich verwende TcpClient-Klasse, um eine Telnet-Verbindung zu implementieren. Was ich nicht weiß, ist, wie man das Ende der Antwort bestimmt. Es scheint, dass, sobald DataAvailable Eigenschaft wahr ist, ich die Daten aus Stream lesen und DataAvailable wird vorübergehend auf false festgelegt, während Puffer mit einem weiteren Datenblock gefüllt wird, aber ich denke, dass alle gelesen und weggehen. Wie stelle ich sicher, dass alle Antworten gelesen wurden?Wie mit Verzögerungen bei Telnet-Verbindung programmgesteuert umgehen?

Sie könnten mir raten, wie Sie das Code-Snippet unten ändern können, damit dies richtig funktioniert. Es funktioniert ordnungsgemäß, wenn ich den Code durchtrete, da genügend Zeit für das Abrufen der gesamten Antwort vorhanden ist. Schätze deine Hilfe.

if (this.Stream.DataAvailable) 
{ 
    readBuffer = new Byte[this.Client.ReceiveBufferSize]; 
    do 
    { 
     // read data 
     bytes = this.Stream.Read(readBuffer, 0, readBuffer.Length); 
     Thread.Sleep(10); 
     responseData = String.Concat(responseData, System.Text.Encoding.ASCII.GetString(readBuffer, 0, bytes)); 

     } while (this.Stream.DataAvailable); 

     allDataRead = true; 
     break; 
} 

Antwort

2

Mit TCP-Verbindungen für Anwendungen wie Telnet gibt es kein solches Konzept als das Ende der Übertragung. Sie werden häufig Telnet-Clients finden, die jeden Tastendruck einzeln nacheinander senden, wenn der Benutzer sie eingibt, und es liegt im Ermessen des Servers zu entscheiden, wann er Maßnahmen ergreifen soll, normalerweise, wenn ein Zeilenvorschub erfolgt. Andere Clients können einige wenige Client-Tasten drücken und sie alle gleichzeitig senden.

Nach dem Aussehen Ihrer App sollten Sie nach Zeilenvorschübe suchen, um das Ende einer Übertragung anzuzeigen.

0

Ich denke nicht, dass es eine gute Idee ist, DataAvailable für diesen Zweck zu verwenden. Das Ende Ihrer Antwort ist, was auch immer Ihr Protokoll sagt.

Es ist besser, blockierende Aufrufe wie Lesen zu verwenden, um Ihre Daten zu lesen, und verwenden Sie jedes Protokoll, das Sie eingerichtet haben, um mehr und mehr zu lesen. Möglicherweise werden nicht alle gewünschten Daten zurückgegeben, da Lesen nicht zurückgegeben wird, wenn alle Ihre Daten gelesen werden. Wenn jedoch einige Daten gelesen werden, müssen Sie überprüfen, wie viel gelesen wurde.

Wenn Ihr Protokoll Telnet ist, werden Sie wahrscheinlich auf jedes empfangene Byte reagieren wollen, wie bei einem Terminal, das Sie echo oder Befehle verarbeiten möchten oder was nicht.

DataAvailable ist vielleicht geeignet, um zu prüfen, ob ein Read beim Aufruf blockieren würde (es wird mit dem zurückkommen, was im Puffer ist), aber es macht Ihre Schleife weniger einfach.

0

Ist dies eine tatsächliche Telnet-Verbindung, d. H., Verbinden Sie sich mit einem Telnet-Server oder mit "Telnet" meinen Sie wirklich "TCP/IP-Socket"?

Zuerst ermitteln, ob der Server die Verbindung trennt, wenn die Übertragung abgeschlossen ist. Wenn ja, können Sie einfach bis zum Ende des Streams lesen. Andernfalls, wenn nicht, müssen Sie einen Hinweis in den Daten verwenden, um festzustellen, ob der Lesevorgang abgeschlossen ist. Unterschiedliche Protokolle funktionieren in dieser Hinsicht auf unterschiedliche Weise. Wenn Sie uns das Protokoll erläutern könnten, könnten wir vielleicht eine direktere Antwort geben. Annäherungen fallen im Allgemeinen in zwei Lager: einschließlich einer Zählung von Bytes/Zeichen zu Beginn der Antwort (der Empfänger liest einfach so viele Bytes/Zeichen) oder verwendet eine Markierung, um das Ende der Antwort zu begrenzen (der Empfänger liest bis zum Empfang der Trennzeichen).

+0

Es ist eine Verbindung zum Telnet-Server mit tcp/ip-Socket und Port 23. Der Server beendet die Verbindung nicht. Der erste Teil der Telnet-Sitzung ist die Authentifizierung, wenn der Server nach dem ersten Benutzernamen und dann nach dem Kennwort fragt. Ich werde das Trennzeichen überprüfen und Sie später informieren. Vielen Dank. – David

+0

Angenommen, der Telnet-Server ist eine Konsolensitzung nach einem Unix/BSD/Windows/etc. Server, dann können Sie den Eingabeaufforderungstext als Trennzeichen verwenden. –

Verwandte Themen