Seite 1 von 1

[gelöst] [QT4] QUdpSocket::bind() Problem

Verfasst: 4. November 2005 21:25
von Timewarp
Hallo zusammen,

Ich haben ein Problem bei einer Udp-Verbindung zu einem Gameserver den ich abfragen möchte. Der Aufruf von bind() um mich mit dem Server zu verbinden schlägt nämlich jedes mal fehl. Hier ein Code-Snippet:

Code: Alles auswählen

void UdpServer::initSocket()
{
        udpSocket = new QUdpSocket(this);
	if(!udpSocket->bind(QHostAddress("195.4.17.142"), 27960))
	{
		QMessageBox::information(NULL, "","can't bind server");
	}
	else
		connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
}
Habe mich dabei eigentlich ziemlich genau auch an das Beispiel von den Trolls gehalten, bekomme aber jedes mal die MessageBox zu sehen. Damit kann ich dann logischer weise keine eingehenden Daten verarbeiten. Um Datagrams zu senden bedarf es ja keinem bind() an den Server und das funktioniert dann auch. Im Netzwerksniffer kann ich auch die Antwort des Servers sehen (die auch so ist wie ich sie erwarten würde) aber nützt ja nichts weil ich wegen fehlgeschlagenem bind() keine Daten entgegennehmen kann.

Irgendjemand eine Idee ?

Verfasst: 5. November 2005 19:51
von Timewarp
Ok ... ein Tag (und viel try und error) später bin ich etwas schlauer aber funktionieren tut es leider immer noch nicht. :(
Der Versuch des Binds auf den Gameserver war wohl grundlegend falsch da es für mich im Moment so aussieht als das man auf einen lokalen Port binden muss um dort auf eingehende Datagrams zu warten.

Das dumme ist nur das ich den Port gar nicht kenne. Ich schicke mit writeDatagram() eine Statusabfrage an den Gameserver. writeDatagram() schnappt sich dabei anscheinend den nächsten freien upd-Port (z.B. 1365).
Auf dem gleichen Port antwortet mir dann auch der Gameserver ... nur ist es mir noch ein Rätsel wie ich rausfinden soll auf welchem Port writeDatagram denn die Statusabfrage rausschickt damit ich auf dem Port auch lauschen kann.

Verfasst: 5. November 2005 20:17
von Timewarp
So Problem gelöst.

writeDatagram ist bei der Problemstellung auch der falsche weg. Das ist wohl nur dazu da um udp-Datagrams raus zu schicken wenn man keine Antwort darauf erwartet.
Wenn man wie ich eine Antwort erwartet sollte man anstatt bind() die Funktion connectToHost verwenden und sobald man das Signal connected() bekommen hat kann man dann fröhlich mit write() seine Daten rausschicken. Die Antworten kommen dann auch wie bei der bind() Variante über das readyRead() Signal an.


Ich hoffe mal das qtforum.org bald zurück ist. Ich meine es ist zwar Samstag aber hier ist ja wirklich tote Hose.