Seite 1 von 1

[Qt4] Empfangen und senden auf TcpSocket

Verfasst: 8. Januar 2006 10:33
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

Verfasst: 15. Januar 2006 11:20
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. ;-)

Verfasst: 17. Januar 2006 00:33
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...