PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Qt] QSocketDevice richtig benutzen



Boron
21-04-2004, 09:27
Hallo zusammen,

Die Qt-Dokumentation is ja toll, aber an Beispielen schweigt sie sich aus.
Ich brauche nämlich ein kleines Beispiel, das mir zeigt, wie man über UDP Daten verschickt.

Hier an meiner FH haben wir ein Projekt laufen, in dem ein Programm, das eigentlich nur die visuelle Präsentation für ein Roboterfußballspiel darstellt, mit Daten gefüttert werden soll.
Dieses Programm soll über Netzwerk (UDP, weil Quittierungssignale unnötig sind) permanent die x,y Positionsdaten der Roboterspieler auf dem Spielfeld geschickt bekommen.

Den Empfang dieser Daten, und auch das Senden anderer Daten wollen wir in einen eigenen Thread auslagern. Dafür brauchen wil schon mal die Klasse QSocketDevice, so viel haben wir rausgefunden.

Aber wie zum Teufel funktioniert das mit dem Netzwerk.
Welche Schritte muss man ausführen um etwas empfangen, bzw. senden, zu können zu können?
Server <--> Client. Auf welcher Seite ist jetzt was?
bind(), listen(), connect(), accept() --> hä, wie denn jetzt?

Wie also benutzt man die Klasse QSocketDevice richtig, nicht QSocket, wir wollen nicht mit TCP arbeiten. Beispiele zu QSocket findet man ja massenhaf tim Netz, aber QSocketDevice nutzt fast niemand.

Wer mir das erklären kann, evtl. auch ein bisschen Beispielcode postet, dem ist meine ewige Dankbarkeit gewiss :).

bmann
21-04-2004, 15:56
Hi
Eines vorweg: seid ihr euch wirklich sicher, dass ihr UDP wollt? Ausser in sehr zeitkritischen Anwendungen (etwa Multimedia Anwendungen) ist das eigentlich unnötig und kann zu ekelhaften schwer zu findenden Problemen führen (es kann jederzeit passieren, dass eine Nachricht einfach über den Jordan geht).

Aber wenn es denn sein soll:
UDP ist ein Verbindungsloses Protokoll, das heisst du kannst connect() nicht gebrauchen. listen() und accept() ist praktisch ebenfalls sinnlos, da das die Gegenseite eines verbindungsorientierten Protokolls (TCP) darstellt. Es bleibt also nicht viel übrig.
Ich hab es nie versucht, nagel mich also nicht drauf fest. Aber nach einer (fast ergebnislosen) Suche nach "UDP" in der QSocketDevice Dokumentation hab ich mal nach dem Namen "Datagram" gesucht, der ja auch für als Parameter für den c'tor verwendet wird. Das ergab dann vor allem das hier:


Q_LONG QSocketDevice::writeBlock ( const char * data, Q_ULONG len, const QHostAddress & host, Q_UINT16 port )
[...]
This is used for QSocketDevice::Datagram sockets. You must specify the host and port of the destination of the data.


Ich würde sagen das ist genau das, was du haben willst.

Wie du dann allerdings von dem Socket wieder liest, da kann ich dir im Moment auch nicht weiterhelfen (UDP mache ich nie). Ich schätze da muss erst bind() aufgerufen werden und dann readBlock(), aber sowas müsste man in einer beliebigen Doku zu UDP und Unix sockets nachlesen können.

CU
Andi

anda_skoa
21-04-2004, 17:26
Ja, Datagram als Typ des SocketDevice beim Konstruktor angeben.

Ich benutze bind() immer auf beiden Seiten.

Lesen geht analog zu Schreiben mit readBlock.
Man kann dabei zB mit waitForMore() immer warten, bis eine gewisse Anzahl Bytes da sind, wenn man die Größe der eigenen Datenpakete kennt.

Dabei sollte man dann vielleicht einen Thread verwenden.

Ciao,
_

Boron
25-04-2004, 14:36
Dank euch beiden :). Das funktioniert jetzt.

anda_skoa
25-04-2004, 18:28
Man kann theoretisch zum Sende auch das SocketDevice mit connect "verbinden" und dann den writeBlock Aufruf ohne Zieladresse benutzen, aber meiner Erfahrung nach geht das nicht überall klaglos, unter Windows und Linux hats bei mir geklappt, aber unter Tru64 gabs das Probleme.

Ciao,
_