Seite 1 von 1

QTCPServer und telnet

Verfasst: 8. April 2009 15:38
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

Verfasst: 9. April 2009 08:12
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..

Verfasst: 9. April 2009 10:00
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.

Verfasst: 9. April 2009 10:16
von chrootdev
Nur so aus interesse, warum verwendest du nicht ssh statt telnet?

Verfasst: 9. April 2009 10:56
von Christian81
Ich benutze den gleichen Ansatz und es funktioniert prima (telnet von Linux)

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

Verfasst: 9. April 2009 11:11
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?

Verfasst: 9. April 2009 11:20
von Christian81
Nein - nicht wirklich.
Was er will ist eine einfache Steuerung eines Programms per ASCII-Kommandos - nix mit Passwörtern oder geheimen Infos.

Verfasst: 9. April 2009 11:42
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...

Verfasst: 9. April 2009 18:29
von upsala
@chrootdev: Wo findet man den passende Funktionen für einen SSH-Server bzw. -Client in Verbindung mit Qt?

Verfasst: 11. April 2009 16:10
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

Verfasst: 16. April 2009 16:31
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