QTCPServer und telnet

Alles rund um die Programmierung mit Qt
Antworten
moviemax
Beiträge: 56
Registriert: 10. März 2008 09:49
Wohnort: München

QTCPServer und telnet

Beitrag von moviemax »

Hallo zusammen,

Folgendes Problem: Ich habe ein Programm (deamon) ohne gui.
das Programm soll irgendwann von einem anderen programm gesteuert werden, das es noch nicht gibt. Damit ich mein Programm zur lauftzeit steuern kann, brauch ich ein Comandline Interface. Dazu will ich telnet zur hilfe nehmen.

Beispiel. Ich bau ein http-server, es gibt aber noch keine browser dafür:

telnet http://myserver 80

Dann kann ich in die telnet console schreiben:
GET / HTTP 1.0

und der (http) server gibt mir die index.html auf telnet aus.


Ich will natürlich kein http sondern bei definierten Befehlen
GET STATUS oder STARTJOB 1 2 3
eingeben und das Programm gibt mir den Status text bzw. OK zurück und startet den Job mit args 1 2 3

Ich will jetzt natürlich nicht den fertigen Code von Euch sondern nur folgende Hinweise:

1.
QTCP Server läuft.
Telnet konectet sich auf mein Program auf address + port

Wenn ich jetzt in die Telnet Konsole eingebe sehe ich nur zwei drei seltame coursour springen aber nicht den Text den ich eingebe.

Wie kann ich das dem QTCP Server bei bringen?

danke moviemax

PS. Der Server/Socket ist bisher so wie beim Chat beispiel aus den QT Demoprogrammen aufgebaut
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag von CaptnChaos »

Dein Server wartet auf Port 80 und wertet aus was er so alles an Volltext empfängt. Ist was brauchbares dabei, springt er in die dazugehörende Funktion.
Bsp:

Code: Alles auswählen

if(command.contains("GET"))
{
	if(command.contains("STATUS"))
	{
		sendStatus();
	}
}
PS: Wo hast du denn Rechtschreibung oder ähnliches gelernt?? (konectet, QTCP Server, Konsole/console, coursour, bei bringen, Chat beispiel, Ich bau ein http-server) Es ist keine Wonne deinen Text zu lesen, zumal der Textfluss auch ziemlich abgehackt ist...
Wenn man eine vernünftige Antwort will sollte man sich auch bemühen eine vernünftige Frage zu stellen..
moviemax
Beiträge: 56
Registriert: 10. März 2008 09:49
Wohnort: München

Beitrag von moviemax »

Hallo Panic,
die ankomenden Daten zu parsen ist nicht das Problem, sondern
dass ich auf der Telnet Konsole nicht sehe was ich eingebe.
chrootdev
Beiträge: 70
Registriert: 18. April 2008 17:52

Beitrag von chrootdev »

Nur so aus interesse, warum verwendest du nicht ssh statt telnet?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ich benutze den gleichen Ansatz und es funktioniert prima (telnet von Linux)

ssh: Warum sollte man sowas dafür benutzen??
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
chrootdev
Beiträge: 70
Registriert: 18. April 2008 17:52

Beitrag von chrootdev »

Christian81 hat geschrieben:ssh: Warum sollte man sowas dafür benutzen??
Auszug aus der wikipedia:
SSH ermöglicht eine sichere, authentifizierte und verschlüsselte Verbindung zwischen zwei Rechnern über ein unsicheres Netzwerk. Dadurch dient es unter anderem als Ersatz für die Vorgänger rlogin, telnet und rsh; diese übertragen jeglichen Netzverkehr, darunter auch die Passwörter, unverschlüsselt und sollten daher nicht mehr verwendet werden.
Reicht das als antwort?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Nein - nicht wirklich.
Was er will ist eine einfache Steuerung eines Programms per ASCII-Kommandos - nix mit Passwörtern oder geheimen Infos.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag von CaptnChaos »

Vielleicht weil entweder das Echo in deinem Telnet-Client ausgeschaltet hast, oder weil dein Server kein Echo sendet(was eigentlich auch witzlos ist).
Und ssh ist auch übertrieben für diese Anwendung. Solang da nichts Sicherheitskritisch ist braucht man kein ssh...
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

@chrootdev: Wo findet man den passende Funktionen für einen SSH-Server bzw. -Client in Verbindung mit Qt?
moviemax
Beiträge: 56
Registriert: 10. März 2008 09:49
Wohnort: München

Beitrag von moviemax »

Das mit dem Echo funktioniert, wenn der Server ein greeting sendet.
Jetzt muss ich nur das protocol und die state machine implementieren.
Werde \n\n als "befehl ende" nehmen.

Was hier ssl bringen soll weiß ich auch nicht. praktisch kann man ja immer ` nen secure layer dazwischen schieben falls man das braucht.

moviemax

PS. Frohe Ostern
moviemax
Beiträge: 56
Registriert: 10. März 2008 09:49
Wohnort: München

Beitrag von moviemax »

So ich habe jetzt folgenden Stand:

// class Connection : public QTCPSocket { ...

Der Server erzeugt pro incomingConnection() einen
Thread. In dessen run() Funktion erzeuge ich ein Exemplar vom
Typ Connection und rufe exec() auf.

(bis hier ähnlich wie qtDemo -> Netzwerk -> (threaded) FortuneServer ,
Anstatt den fortune clienet zu starten kann man auch mit telnet sich seine
Zukunft vorraussagen lassen ;) )

Verbinde ich mich mit "telnet host port" bekomme ich ein greeting und kann
danach irgendwas eingeben. Nach Eingabe von <enter> werden die Zeichen geparst.

So weit so gut! Nun soll ja mit der Eingabe von HELP und QUIT oder START_JOB .... etwas passieren.

Der Parser soll nun aufgrund des eingebenen Strings ein Befehl erzeugen
und diesen an eine Event Schleife senden:

http://de.wikipedia.org/wiki/Kommando_(Entwurfsmuster)

* Der Aufrufer ist meine Connection (QTCPSocket)
* Der Empfänger die QCoreApp Eventloop und der
* Klient die eigentliche Funktionalität des Programms.

Jetzt komme ich etwas ins schwimmen bezüglich QObject und QEvent.

Der Einfachheit wegen habe ich erst mal nur ein Typ "Command" (die sich im Namen unterscheiden, später wird das pro Commando wie im Entwurfsmuster definiert pro Befehlstyp eine abgeleitete Klasse von Command ).
Command ist aber abgeleitet von QObject, Klappt das so oder sollte Command eher von QEvent abgeleitet sein.

Es sollte auch in beiden Richtungen laufen: Klient - sendet befehl an Eventloop (Empfänger) und diese an Connection ... geht das auch wenn mehrere Verbindungen offen sind?

Gruß moviemax
Antworten