Seite 1 von 2

QT Netzwerkprotokoll

Verfasst: 28. Januar 2009 14:28
von Neo E
Hallo, ich habe vor mir ein Netzwerkprotokoll zu bauen mit QT. Dabei soll die Teilnehmer Statusdaten austauschen können (Strings) aber auch größere Daten übertragen werden (Bitmaps).

Die Datenübertragung im Einzelnen ist nicht das Problem, aber mir fehlt im Moment eine Idee wie ich herrausfinden kann was da gerade für Daten ankommen.

Hat da vielleicht jemand einen Tipp für mich.

Verfasst: 28. Januar 2009 14:49
von androphinx
Also mit den paar Daten den du mir dazu gegeben hast, kann ich nur das blaue vom Himmel raten.
Also ich mache das eigentlich immer über eine ID die ich entweder mit ins Packet packe oder extra vorher sende.

Du solltest aber erstmal langsam anfangen und erstmal damit anfangen, dass sich jeder normal Nachrichten senden kann.

Mfg androphinx

Verfasst: 29. Januar 2009 10:47
von Neo E
Sag mir mal was für Informationen du brauchst um mir zu helfen. Eigentlich hast du das aber auch schon, Thema ID. Aber wie lese ich die denn aus, ich habe ja doch nur einen Datenstrom. Daran hängt es im Moment, den Datenaustausch bekomme ich hin wenn ich weiß was da für Daten ankommen.

Verfasst: 29. Januar 2009 10:52
von Markus
Hey...

Schau Dir doch mal das Chat-Beispielprogramm von Qt an. So bin ich auch mit der Netzwerkprogrammierung gestartet, um dann langsam immer komplexer zu werden.

http://doc.trolltech.com/4.4/network-network-chat.html

Verfasst: 29. Januar 2009 10:57
von RHBaum
Ja die ganzen randbedingungen fehlen !

wie sicher / robust muss dein protokoll sein
wie schauts mit der performance aus, was fuer einen "verlust"(protokolloverhead) oder besser was fuer eine nutzdatenrate kannst du dir leisten ?
WIe gestaltet sich der datenaustausch insgesamt, hasst du nur kurzzeitige uebertragungen von paar wenigen Kbytes, und kannst schon die "pausen" zum synchronisieren nehmen, oder hasst du einen grossen fetten Datenstrom im vollast ueber laengere zeit ???

wie sind die daten aufgebaut ... richtig schoen willkuerlich, oder immer viele gleichartige bloecke (datenstrukturen) hintereinander ...

Fuern einstieg empfehl ich als erstes immer XML zu streamen, iss zwar graessliche performance, aber "relativ" leicht zu implementieren und eigentlich sehr robust ...

Ciao ...

Verfasst: 29. Januar 2009 11:34
von Neo E
Ich glaub du gehst mir da ein bißchen zu weit RHBaum, ich bekomme das mit der Datenübertragung schon hin und Performancesachen sind im Moment erstmal nicht so sehr wichtig. Es geht mir im Moment wirklich einfach nur darum was ich mit den Daten mache wenn sie da sind.

@Markus das QT Chat Beispiel hab ich mir schonmal angesehen aber das hilft mir bei meiner Frage nicht so wirklich weiter.

Um nochmal genauer zu beschreiben was ich vor habe. Ich habe Clients die Webcams angeschlossen haben und die sollen die Bilder übertragen aber eben auch Statusinformationen, wie z.B. ist die Kamera an...
Und da fehlt mir eben die Idee wie ich die verschiedenen Daten die da ankommen unterscheide.

Verfasst: 29. Januar 2009 13:01
von androphinx
jetzt kommen wir der sache ja schon langsam näher....

grundsätzlich kannst du zum beispiel zwei getrennte protokolle machen, die an zwei unterschiedlichen ports liegen. an einem der bildstrom und an dem anderen der statusbericht und mglw. steuerkommandos.

die schönere variante ist aber ein protokoll. du könntest zum beispiel immer das erste byte für etwas festlegen. Bsp:

Code: Alles auswählen

1 = Neues Bild
2 = Verbindung zur Kamera getrennt
3 = Statusbericht
die nächsten bytes im packet sind dann einfach die entsprechenden daten.

Mfg androphinx

Verfasst: 29. Januar 2009 14:07
von RHBaum
Schau dir an, wie andere Protokolle das machen ....

HTML ist zum beispiel ein halb textuelles halb binaeres protokoll ...
es werden anfragen mit bestimmten keywortern geschickt
(Get Post ... ) und zurueck kommen packete wo zuerst ein header kommt (wird mit textuellen mitteln geparst) in dem die groesse der typ usw. drinnestehen, und danach nen Binaerer block mit der angegebenen groesse ... der binaer als datei oder eben gleich al htmlblock gehandhabt wird ...

das geht auch nur in eine richtung ....

also sowas:
<Picture Format=jpg size=123456>
Danach auch das zeilenende triggern, und dann die naechsten "size" Anzahl zeichen als binaeren block puffern und an den viewer als bild geben, danach wieder im textmode die Befehle parsen ....

BTW.
webkamas bieten meist doch schon nen datenstrom an, denn nur noch uebers netzwerk umleiten musst ... und das sogar schon als standardisiertes protokoll .. (mpeg, avi) ....

Da boete sich dann die version mit den 2 ports an ....
oder willst wirklich nur einzelne bilder schicken ???

Ciao ...

Verfasst: 29. Januar 2009 14:23
von Neo E
Ich plädiere für die zweite Variante aber genau bei dieser Variante fehlt mir eben das Wissen wie ich die Informationen in den Datenstrom reinbekomme und dann wieder raus.

Oder besser wie ich die Metadaten von den Nutzdaten im Datenstrom spariere. Versteht ihr was ich meine?

Verfasst: 30. Januar 2009 05:55
von FaS
Eigentlich wurde die Frage schon beantwortet. Du kannst die Datenströme nur unterscheiden, indem du dir den Inhalt anschaust. Es fliegt ja kein Geist parallel mit. Mindestens der erste Teil des Stromes muss also ein spezielles Format besitzen, welches aussagt was los ist, alles weitere wird inkrementell von den vorherigen Daten abgeleitet.

Verfasst: 31. Januar 2009 00:56
von The User
Das Protokoll, das du meinst, heißt http nicht html. ;)

Aber Neo sagte ja, er plädiere nun für getrennte Datenströme über ein Videoformat. Aber da brauchst du dann natürlich einen Decoder für (ob das Phonon unterstützt??) und vorallem Informationen über die Webcam. Eventuell hilft dir ein Blick in den Quellcode von Kopete weiter, wenn du etwas konkretes über Webcams mit Qt wissen möchtest.
Ich habe davon keine Ahnung. ;)

Viele liebe Grüße
The User

Verfasst: 4. Februar 2009 10:30
von Neo E
@Fas genau dahin geht ja meine Frage, wie stelle ich denn in den ersten Teil der Daten rein. Und wie lese ich ihn dann auch wieder aus.
Könntet ihr mir da bitte keine theoretische sondern bitte eine konkrete Antwort geben, denn genau an dem Punkt hängt die ganze Sache.

Verfasst: 4. Februar 2009 12:28
von upsala
Leute, wenn ihr schon Daten übertragen wollt, da solltet ihr euch auch darüber im klaren sein, wie die Daten auszusehen haben (Im Extremfall fürs Debugging auch Byteweise) anders brauchst du gar nicht anzufangen irgendwelche Daten übertragen zu wollen.

Verfasst: 4. Februar 2009 17:19
von FaS
Die Datenübertragung im Einzelnen ist nicht das Problem
Was ist dann das Problem?
Datenaustausch bekomme ich hin wenn ich weiß was da für Daten ankommen.
Du musst immer VORHER wissen, was für Daten als NÄCHSTES kommen. Beispielsweise weißt du, dass als erstes eine Informationsstruktur (oder die erwähnte ID) kommt. Da drin steht, was als nächstes kommen wird. Anschließend könnte man wieder dieselbe Informationsstruktur erwarten.

Sieh dir auch mal QDataStream an. Man sollte keine systemspezifischen Daten übertragen (wie z.B. ein int).

Verfasst: 5. Februar 2009 10:46
von Neo E
Zitat:
Die Datenübertragung im Einzelnen ist nicht das Problem

Was ist dann das Problem?
Um das mal zu konkretisieren, ich kann momentan Bilder übertragen (Client zum Server) und ich kann auch Befehle übertragen (Server zum Client). Das funktioniert also ohne Probleme. Wenn ich jetzt aber auch Befehle vom Client zum Server übertragen will weiß ich nicht wie ich die beiden Datentypen, z.B. IMG und String, beim Bearbeiten des eingegangenen Streams umgehen bzw. diese unterscheiden soll.

Und zum dem anderen Punkt nochmal ganz konkret, ich weiß nicht wie ich das programmiertechnisch umsetzten soll was du da beschrieben hast. Theoretisch verstehe ich es aber praktisch umsetzten kann ich es eben nicht und genau da liegt eigentlich von Anfang an mein Problem.