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);
}
Einfach geraten: vielleicht ist die Schleife zu schnell und daher ist CanRead
und DataAvailable
false?!
Hast Du Dir mal [FAQ] TcpClient: einfaches Beispiel angeschaut?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
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