Telnet Terminal verbessern?

jccTeq

Erfahrenes Mitglied
Hi Leute,

ich hab ein Programm geschrieben, welches sich per Telnet text-/befehlsbasiert bedienen lässt. Ich möchte diese Pseudo-Shell jetzt wesentlich verbessern. Momentan ist das einfach nur ein Einlesen und Parsen der eingegebenen Zeichen und ein entsprechendes Reagieren auf bestimmte eingegebene Befehle. Nichts weiter.

Ich möchte jetzt, daß diese Telnet Konsole meines Programms
a) einen richtigen Prompt bekommt, der immer zu sehen ist, sobald ich einen Befehl eingeben kann
b) eine Befehls History bekommt, durch die man - wie in der bash - per Cursor rauf/runter durchsteppen kann
c) so Features bekommt, wie TAB zum automatischen Ergänzen von Befehlen und so...

Punkt a ist mir der Sauberkeit wegen am wichtigsten.

Könnt ihr mir da ein paar Lösungsansätze, Links, Stichworte (für Google-Suche) etc. nennen? Ich finde selbst nichts, weil mir keine Schlagworte einfallen.

Gruß,
Hendrik
 
Das Programm selbst läuft auf einem Linux System, soll aber beispielsweise mit Putty fernbedienbar sein. Die Oberfläche ist einfach nur ein geöffneter Socket, auf den man sich per Putty connecten kann, und auf dem dann Ausgaben aus meinem Programm erscheinen, über den man aber auch Befehle an das Programm absetzen kann.

Diese Befehls-Ein-/Ausgabe soll jetzt massiv verbessert werden. Darum geht's.


Den Link schau ich mir mal an
 
Hast du keine andere Idee? Ich hab versucht, per tcsetattr() ein paar Einstellungen auf dem Terminal zu machen, aber er sagt mir bei einem Socket FD immer "Invalid Argument". Ist also angeblich kein Terminal. Ist ja auch keines... wie erzähl ich denn dem Socket, daß er ein Terminal ist?
 
Hmm... in einem anderen Forum meinte man, die Lösung für meine Wünsche sei die GNU Readline Bibliothek. Jetzt ist nur die Frage, wie ich readline mit nichtblockierenden Sockets verbinde. Also daß die Eingabe für Readline nicht vom StdIn kommt, sondern vom Socket. Geht das?
 
moin


Du kannst unter Windows den stdin oder stdout umleiten, drum denke ich das das unter Linux auch geht.


mfg
umbrasaxum
 
Okay, so weit so gut... also mein Programm macht das jetzt folgendermaßen:


Code:
Telnet Client -> Port 6700 { -> Socket -> Pseudo Terminal Slave Seite -> Pseudo Term Master -> rl_callback_read_char }

(alles in geschweiften Klammern läuft innerhalb meines Programms im Hauptprozess ab)

Ich schicke dem Client jetzt die Telnet Commandos
- IAC WILL ECHO (Client beantwortet mit IAC DO ECHO)
- IAC DO SUPPRESS-GOAHEAD (Client beantwortet mit IAC WILL SUPPRESS-GOAHEAD)


Meine aktuellen Probleme sind noch folgende:
Der Client überträgt die eingegebenen Zeichen immer noch nicht sofort.
Ich nutze readline per rl_callback_handler_install und rl_callback_read_char. Ein durch das Terminal geschleiftes Steuerzeichen für Readline führt immer noch dazu, daß Readline selbst, also die Funktion rl_callback_read_char blockiert.

Letzteres ist mein größtes Problem. Bitte helft mir dabei! Sobald die Readline Funktion ein Zeichen 0x0A oder 0x1B (Linefeed oder Cursor hoch oder ähnliches) bekommt, bleibt die Funktion stecken und ich weiß nicht, warum Ich weiß nicht, ob es an meinen Terminal-Einstellungen liegt, oder an Readline oder an dem Telnet Client...

Ich komm mal wieder nicht weiter und bin auf Hilfe angewiesen. Danke

Gruß,
Hendrik
 
Zurück