[Qt4] Empfangen und senden auf TcpSocket

Alles rund um die Programmierung mit Qt
Antworten
heikob
Beiträge: 81
Registriert: 23. März 2005 23:20

[Qt4] Empfangen und senden auf TcpSocket

Beitrag von heikob »

Hallo,

ich möchte eine Serveranwendung auf der Basis von QTcpSocket schreiben. Dazu habe ich mir einen Server auf der Basis des ThreadedFortuneServer Example aufgebaut. Das Empfangen der Daten vom Client funktioniert auch prima. Nun möchte ich dem Client eine Bestätigung zurück schicken, um den Erfolg bzw. Misserfolg der Übertragung zu signalisieren.

Momenten sieht mein Thread folgendermaßen aus:

Code: Alles auswählen

#include "CoreServerThread.h"
#include <QtNetwork>
#include <iostream>

CoreServerThread::CoreServerThread(int socketDescriptor, QObject *parent) : QThread(parent), socketDescriptor(socketDescriptor)
{}

void CoreServerThread::run()
{
	blockSize=0;
	QTcpSocket socket;
	tcpSocket = &socket;
	//Pruefen, ob Socket verfuegbar
	if(!socket.setSocketDescriptor(socketDescriptor))
	{
		emit error(socket.error());
		return;
	}
	connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readData()));
	//Kommunikation mit dem Socket
	tcpSocket->waitForDisconnected(-1);
}

void CoreServerThread::logError(QAbstractSocket::SocketError socketError)
{std::cerr << "Socket Error: " << socketError << std::endl;}

void CoreServerThread::readData()
{
	QByteArray input(2,0x00);
	QDataStream in(tcpSocket);
	quint8 tmp=0;
	if(tcpSocket->bytesAvailable()==1){
		in>>tmp;
		input[0]=tmp;
		if(0x31==input[0]){
			std::cout<<"klasse"<<std::endl;
			//ASSERT!!!
			in<<0x00;
                        //ASSERT!!!
		}
		else{std::cout<<"Fehler"<<std::endl;}
	}
	else{std::cout<<"Falsche Länge"<<std::endl;}
}
Wenn ich nun auf den Stream etwas zurück schreiben will, bricht mir das Programm mit der Fehlermeldung ASSERT failure in QOBject(): "Cannot create children for a parent that is in a diferent thread." file kernel/qobject.cpp, line 552 ab. Allerdings verstehe ich nicht ganz, welches Object er erzeugen möchte, da der Stream ja bereits existiert und er darauf ja eigentlich nur schreiben müsste.

Habe ich etwas grundlegenden bei der Kommunikation via TCP übersehen? Hat vielleicht jemand einen Vorschlag, wie ich diese Bidirektionale Kommunikation realisieren kann oder sogar ein Code-Schnipsel?

Vielen Dank
HeikoB
heikob
Beiträge: 81
Registriert: 23. März 2005 23:20

Beitrag von heikob »

Hallo,

hat hier wirklich niemand eine Idee, wieso das nicht funktioniert? Nicht mal eine Anregung? Oder ist die Frage einfach zu trivial um hier beantwortet zu werden? Ich hoffe doch nicht. ;-)
Esleborn
Beiträge: 265
Registriert: 27. Januar 2005 01:23
Wohnort: Baden-Würtenberg
Kontaktdaten:

Beitrag von Esleborn »

sry seh grad nicht den Fehler, aber ich hab auch nicht sooo viel Zeit... sry

Ich hab aber mal ein paar Klassen geschreiben mit welchen dass relativ gut funktioniert...
vllt kannst du da was rauslesen... (sind aber insgesamt ziemlich groß... eine Server-, eine Client-, eine Stream- und eine NetworkInformation-Klasse, die miteinander verknüpft sind)

Wenn du sie haben willst, musst du dich halt per PM melden...

PS: Den Fehler mit dem Objectparent in einem anderen Thread hatte ich auch ein paar mal an völlig vermurksten Stellen...
Glaube an eine Lösung, nur dann kannst du auch eine finden.
Antworten