Laden...

Telnet: Datenpaket unvollständig?

Erstellt von myst3rium vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.539 Views
M
myst3rium Themenstarter:in
2 Beiträge seit 2012
vor 11 Jahren
Telnet: Datenpaket unvollständig?

Hallo,

ich habe ein kleines (?) Problem mit Telnet, wobei nicht einmal Google mir helfen wollte.
Darum habe ich mich (ja, bin neu hier) kurzerhand registriert, um
evtl. auf einen Lösungsansatz zu kommen.

Folgende Situation:

Ich habe aktuell ein Programm ("Programm A"), welches Daten über einen offenen Port bereitstellt.
Diese Daten lassen sich via Telnet auch relativ gut auslesen.

Wird allerdings die Datenmenge zu groß, wird (scheinbar) nur ein Teil der Daten übertragen.

Während der Laufzeit von "Programm A" werden neue Daten gesammelt und ebenfalls
über Telnet "verschickt". Interessanter weise kommen die dann auch wieder an!

Warum nur scheinbar?

Nun. Aktuell lausche ich mit einem TCP-Client den Port ab. Dabei fehlen aber immer ein paar Datensätze. Auch über die Windows-Konsole: telnet <<IP>> <<PORT>>
Hier fehlen ebenfalls immer einige Datensätze.

Greife ich nun allerdings über PuTTY -> Telnet zu und verändere ein paar Einstellungen
(-> "Lines of Scrollback": 200 -> 2000) so werden alle Datensätze angezeigt.

Daraus folgere ich mal, dass ich nur eine bestimmte Datenmenge gesendet bekomme und
in meinem auslesenden Programm quasi den nächsten Datensatz anfordern muss.

FRAGE: Wie bringe ich meinem C#-Programm bei, dass es den nächsten Datensatz holen soll?

CODE:


// Neue Connection aufbauen
Listener = new TcpClient();
Listener.Connect(Host, Port);
NetworkStream ns = Listener.GetStream();

// Welcome-Message auslesen
// Passwort senden (LogIn)

while (true)
{
    // Daten empfangen
    StringBuilder sb = new StringBuilder(string.Empty);
    while (ns.CanRead && ns.DataAvailable)
    {
        sb.AppendFormat("{0}", (char)ns.ReadByte());
    }

    string result = sb.ToString(); // <- Hier fehlen aber ein paar Datensätze

    Thread.Sleep(100);
}

16.806 Beiträge seit 2008
vor 11 Jahren

Einfach geraten: vielleicht ist die Schleife zu schnell und daher ist CanRead und DataAvailable false?!

Hast Du Dir mal [FAQ] TcpClient: einfaches Beispiel angeschaut?

M
myst3rium Themenstarter:in
2 Beiträge seit 2012
vor 11 Jahren

Wenn du auf das

Thread.Sleep(x00);

in der Schleife raus willst, das ist drin.
(Habe auch spasshalber mal n Thread.Sleep in meine Read-Methode gepackt, was auch nix ändert)
(Habe ich nur vergessen hier zu posten)
Es ist ja nicht so, dass ich gar nix bekomme.

Ich versuche es nochmal zu erklären.
Nehmen wir an, ich habe eine Liste von (alten) Ereignissen:

Ereignis1
Ereingis2
Ereignis3
Ereignis4
Ereingis5
Ereignis6

Dann bekomme ich allerdings nur einen Teil der Liste zugeschickt. z.B. Ereignis 1-4

Kommen nun neue Ereignisse in die Liste,
werden mir auch diese korrekt übermittelt. z.B. Ereignis 7 wird protokolliert -> Telnet sendet mir Ereignis 7.

Wie schon beschrieben schafft es PuTTY aber irgendwie dies zu umgehen, und das brauche ich auch für meine Anwendung.

Was ich gefunden habe, waren sog. Telnet-Befehle: GA (Go Ahead), etc.
was aber seltsame Effekte ausgelöst hat, weil ich da noch nicht ganz durchsteige.

156 Beiträge seit 2010
vor 11 Jahren

Moin,

AFAIR wird der Stream noch irgendwo gepuffert vor dem Senden.

	        this.__socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true);

Was ich gefunden habe, waren sog. Telnet-Befehle: GA (Go Ahead), etc.
was aber seltsame Effekte ausgelöst hat, weil ich da noch nicht ganz durchsteige.

dann lieber wirkllich Telnet implementieren, nur weil Du über Telnet die Ereignisse siehst ist es noch kein Telnet 😉

glaube das wars, mogel