[Qt4] Empfangen und senden auf TcpSocket
Verfasst: 8. Januar 2006 10:33
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:
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
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;}
}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