QTcpSocket hängt im state Connecting fest

Alles rund um die Programmierung mit Qt
Antworten
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

QTcpSocket hängt im state Connecting fest

Beitrag von KartoffelKiffer »

Hallo,

der Titel sagt eigentlich schon alles, nach der Portierung von Qt 4.4.3 auf Qt 4.7.3 funktioniert eine bestimmte Anwendung nicht mehr korrekt.

Nach dem Connect zum Server verändert sich der Status nicht und bleibt bei Connecting, ein DNSLookup hat scheinbar stattgefunden. Es wird auch kein Signal error oder connected abgesetzt.

Eine zweite - weitaus schlankere - Test-Anwendung funktioniert völlig problemlos.

Ich habe so ziemlich alles ausprobiert, was mir eingefallen ist. Ich bete darum, dass euch noch etwas passendes einfällt.

Mir schwebt da etwas in Richtung EventLoop vor, kann mir aber nicht erklären was es da sein könnte. Es müsste sich also zwischen Version 4.4.3 und 4.7.3 dahingehend etwas geändert haben. Leider verraten mir die 13 Changelogs auch nichts zu dem Thema.

Was ich noch sehen konnte, ist die komische Funktionsweise des Servers, dessen Vorgehensweise wie folgt aussieht:

Code: Alles auswählen

	QTcpSocket tcpSocket;
	if (!tcpSocket.setSocketDescriptor(socketDescriptor))
	{
		emit error(tcpSocket.errorString());
		return;
	}

	if (!tcpSocket.waitForConnected(5000))
	{
		emit error(tcpSocket.errorString());
		return;
	}

	qDebug() <<  QString("Client-Thread started (%1)").arg(objectName());
	
	while (true)
	{
		if (!tcpSocket.waitForReadyRead(-1))
		{
			emit error(tcpSocket.errorString());
			return;
		}

		QString request;
		request = tcpSocket.readAll();

		if (request.size() == 0)
		{
			//QMessageBox::error(0, "", "incoming message has length 0");
		}

		qDebug() << request;
	}
Ich bekomme die Meldung, dass der Client-Thread gestartet wurde, also waitForConnected(5000) zu keinem Fehler geführt hat! Dennoch bleibt der Status des Client auf Connecting.

Hoffentlich hat jemand einen guten Rat für mich.


Gruß, KK
ScyllaIllciz
Beiträge: 200
Registriert: 9. Juli 2010 19:31

Re: QTcpSocket hängt im state Connecting fest

Beitrag von ScyllaIllciz »

Dein Problem wird wohl Deine Endlosschleife sein. Wenn Du ein QApplication::processEvents(); in die Endlosscheife hängst, hätten wenigsten die Events eine Chance durch zukommen.

Das beseitigt nur das aktuelle Problem. Ich würde mir das Design Deiner Klasse noch mal überdenken!
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Re: QTcpSocket hängt im state Connecting fest

Beitrag von KartoffelKiffer »

Hallo,

der gezeigte Code läuft in einem Thread ab, der nach erfolgreichem Lesen (waitForReadyRead) wieder in den Ursprungszustand zurück kehren soll, um weitere Nachrichten zu empfangen. Ich habe die Schleife testweise aber auch schon auskommentiert, ohne Verbesserung.

Ich habe mal ein ganz klassisches Beispiel aufgesetzt, bei dem der Server auf eine incomingConnection lauscht und dann per readyRead angetriggert wird, den Socket zu lesen. Aber auch bei diesem Beispiel kommt der Client (wo mein eigentliches Problem liegt) nicht aus dem Zustand des Connecting heraus. Das Signal incomingConnection wird am Server ausgelöst, aber irgendwie wird die Verbindung nicht richtig aufgebaut.
Antworten