QUdpsocket in QThreads

Alles rund um die Programmierung mit Qt
Antworten
wecka
Beiträge: 8
Registriert: 20. Mai 2005 13:40

QUdpsocket in QThreads

Beitrag von wecka »

Hi,

ich habe folgendes Problem in einem Spiel: geplant ist ein Mehrspielermodus, wo zwei Personen gegeneinander spielen. Jeder Beteiligte hat 2 Sender und 2 Empfänger, weil 2 parallele Datenströme unterschiedlicher Priorität benötigt werden.

Habe mich bei der Umsetzung weitestgehend an das Beispiel des FortuneClients/Servers aus der Doku gehalten, nachdem ich bereits einige Stunden mit alternativen Versuchen verbraten hatte.
http://doc.trolltech.com/4.0/network-bl ... lient.html
http://doc.trolltech.com/4.0/network-th ... erver.html

Das Beispiel funktioniert leider mit einem TcpServer und benutzt connectToHost(). Das brauche ich natürlich so bei UDP nicht. Mit bind() hat leider auch nichts wirklich geklappt.

Kann mir jemand einen Tip geben, wie ich das strukturell aufbauen kann?
Zur Zeit gibt es einen Handler, der die benötigten Threads startet und Prioritäten festlegt. Innerhalb der Threads sind die Sockets. Die Kommunikation zwischen Handler und Threads läuft über Signals und Slots. Nun fehlt nur noch eine erfolgreiche Verbindung... :?
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Re: QUdpsocket in QThreads

Beitrag von Goos »

wecka hat geschrieben: Nun fehlt nur noch eine erfolgreiche Verbindung... :?
Tut mir leid dich enttaeuschen zu muessen, aber UDP ist verbindungslos.
Wieso magst ueberhaupt UDP nehmen? Wie kommst auf die Idee?

Goos
wecka
Beiträge: 8
Registriert: 20. Mai 2005 13:40

Beitrag von wecka »

Ich möchte UDP benutzen, weil permanent sehr viele Daten übertragen werden müssen, so dass mir TCP zu viel Ballast hat.

In dem Spiel basiert die Steuerung auf der Webcam.
Wie gesagt haben beide Spieler je 2 Sender und 2 Empfänger, weil 2 parallele Datenströme unterschiedlicher Priorität benötigt werden.
Einer für die Spieldaten und einer für den Austausch von den Bildern aus der Kamera.
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag von Goos »

Du musst dir aber dann darueber im klaren sein, dass bei UDP nicht zwangsweise alles auch auf der Empfaengerseite angkommen muss.

Goos
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag von Goos »

Ach und poste doch mal, wie du es bisher probiert und es nicht funktioniert hat :)

Goos
wecka
Beiträge: 8
Registriert: 20. Mai 2005 13:40

Beitrag von wecka »

Also, ich habe eine Klasse SocketHandler und darin 4 Threads. Von denen hat jeder einen QudpSocket.
Im ersten Versuch hatte ich ein bind() vom Socket im Thread-Konstruktor drin. Leider hatte der bind() nur false zurückgegeben. In einer reimplementierten start()-Methode im Thread bzw. mittlerweile in der run()-Methode gibts dann den eigentlichen Sende- bzw. Empfangsvorgang.

Im zweiten Versuch habe ich mich wie gesagt an das Beispiel in der QT4-Dokumentation gehalten. Das arbeitet mit connectToHost().

Ich habe meinen aktuellen Stand einmal als Datei mit angehängt...
Dateianhänge
netzwerk.rar
(4.04 KiB) 151-mal heruntergeladen
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag von Goos »

Du hast scheinbar gar nichts im Assistant nachgelesen zum Thema QUDPSocket, so wie mir dein Code ausschaut.

Solltest dir zum Thema UDP Socket erstmal die Beispiele
examples\network\broadcastsender
und
examples\network\broadcastreceiver
anschaun.

Goos
gschneider
Beiträge: 2
Registriert: 25. September 2006 15:56
Wohnort: Bonn

udp

Beitrag von gschneider »

Hi,

ich hab's mit ACE schon mehrfach realisiert. Da gibt es bessere Möglichkeiten udp Verbindungen zu schreiben. Die Dinger laufen bei mir in verschachtelten threads ohen Probleme

Gruß
Gert
M@g!ndo$ch
Beiträge: 70
Registriert: 7. Januar 2007 14:56

Beitrag von M@g!ndo$ch »

Hi,

ich habe ein kleines Verständnisproblem bzgl. dem Thema dieses Threads....

Mein Programm funktioniert, aber ich versteh nicht ganz warum ^^

In einer Klasse, die von QThread abgeleitet ist, höre ich auf ein QUdpSocket. Ich lese immer wenn Daten anliegen und speichere sie in einem Puffer. Durch einen Timer getriggert, werden dann die Daten aus dem Puffer an mein restliches Programm weitergereicht.
So sieht der Konstruktor der Klasse aus:

Code: Alles auswählen

UdpListenerThread::UdpListenerThread(int iPort)
{
m_oSocket.bind(iPort);	    connect(&m_oSocket,SIGNAL(readyRead()),this,SLOT(processPendingDatagrams()));

connect(&m_oTimer,SIGNAL(timeout()),this,SLOT(forwardDatagrams()));
m_oTimer.start(50);
}
Soweit is alles klar! Ich hab allerdings in der run()-Methode nix drin, funktioniert aber trotzdem..... Ich dachte eigentlich wenn die run()-Methode beendet ist, wird der Thread beendet.
Returning from this method will end the execution of the thread.
Kann es viell. sein, dass der Thread durch den Timer "am Leben gehalten wird" ???
Antworten