Seite 1 von 1

Eigenes Objekt über TCP

Verfasst: 8. Oktober 2010 22:54
von dazedly
Hallo ich versuche ein Objekt über QTcpSocket an meinen Client zu senden. Nur wenn das Ganze am Client ankommt, gibt es einen segfault.
compile mit

Code: Alles auswählen

add_definitions(-g -march=native -DDEBUG -Wall -Wextra -pedantic -pedantic-errors -Werror -Wno-long-long -L ${CMAKE_CURRENT_SOURCE_DIR} )

Das Objekt

Code: Alles auswählen

#include "testobject.h"

testObject::testObject()
{

}

void testObject::setMessage(QString msg)
{
	this->message = msg;
}

QDataStream & operator << ( QDataStream & stream, const testObject & what )
 {
         stream  << what;
        return( stream );
}

QDataStream & operator >>(QDataStream& stream, testObject& what)
{
 	stream >> what;
	return stream;
}

QString testObject::getMessage()
{
	return this->message;
}

Code: Alles auswählen


#ifndef TESTOBJECT_H
#define TESTOBJECT_H

#include <qt4/QtCore/QObject>


class testObject : public QObject
{
	Q_OBJECT
	public:
		testObject();
		QString message;
		
		friend QDataStream & operator << ( QDataStream & stream, const testObject & what );
		friend QDataStream & operator >> ( QDataStream & stream, testObject & what );
		
		void setMessage(QString);
		QString getMessage();

};

#endif // TESTOBJECT_H
Der Server

Code: Alles auswählen

QByteArray block;
	QDataStream out(&block, QIODevice::WriteOnly);
	out.setVersion(QDataStream::Qt_4_7);
	out << (quint16)0;
	
	testObject *obj = new testObject;
 	obj->setMessage(QString("sadjsdajkfads"));
	
	out << obj;
	out.device()->seek(0);
	out << (quint16)(block.size() - sizeof(quint16));

	QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
	connect(clientConnection, SIGNAL(disconnected()),
	        clientConnection, SLOT(deleteLater()));

	clientConnection->write(block);
	clientConnection->disconnectFromHost();
Der Client

Code: Alles auswählen

QDataStream in(tcpSocket);
	in.setVersion(QDataStream::Qt_4_7);

	if (blockSize == 0) {
		if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
			return;

		in >> blockSize;
	}

	if (tcpSocket->bytesAvailable() < blockSize)
		return;

	testObject obj;

 	in >>obj;
	qDebug() << obj.getMessage();
Wenn mir jemand sagen könnte, was ich falsch mache...

Verfasst: 8. Oktober 2010 23:29
von dazedly
Ich denke einen Pointer kann/darf ich nicht schicken, da der client ihn ja nicht im Ram hat. Aber wenn ich es so versuche:

Code: Alles auswählen

testObject obj;
 	obj.setMessage(QString("sadjsdajkfads"));
	qDebug() << obj.getMessage();

	out << obj;
Schmiert der Server mit einem Segfault ab. qDebug gibt mir das aus, was ich wollte, Also ist das Objekt erfolgreich erstellt. Nur was mache ich falsch?

Verfasst: 9. Oktober 2010 07:10
von Christian81
Und wo stürzt er ab? Ich schätze mal in operator <<(). Aber dafür haben wir nicht den Code und außerdem gibts dafür Debugger...
Abgesehen davon - warum ist das Objekt von QObject abgeleitet wo es doch garnichts von QObject braucht?

Verfasst: 9. Oktober 2010 10:27
von solarix
Ergibt

Code: Alles auswählen

QDataStream & operator << ( QDataStream & stream, const testObject & what )
 {
         stream  << what;
        return( stream );
} 
nicht eine Endlos-Rekursion?

Müsste da nicht stehen

Code: Alles auswählen

QDataStream & operator << ( QDataStream & stream, const testObject & what )
 {
         stream  << what.getMessage();
        return( stream );
} 


hth..

Verfasst: 9. Oktober 2010 11:22
von dazedly
Christian81 hat geschrieben:Und wo stürzt er ab? Ich schätze mal in operator <<(). Aber dafür haben wir nicht den Code und außerdem gibts dafür Debugger...
Abgesehen davon - warum ist das Objekt von QObject abgeleitet wo es doch garnichts von QObject braucht?
Danke, hast mich auf gd gebracht zum debuggen, ich hab mich da ein wenig eingelesen.

@Solarix, das ziel ist, das befüllte Objekt zu schicken und mit dem client zu verarbeiten. Du hast recht, ich habe eine endlos rekursion gebaut. Auszug aus gdb:

Code: Alles auswählen

#2728 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2729 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2730 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2731 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2732 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2733 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2734 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2735 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2736 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2737 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2738 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2739 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2740 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2741 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2742 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2743 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2744 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2745 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2746 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2747 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2748 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2749 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2750 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2751 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2752 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2753 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2754 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2755 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2756 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2757 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2758 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2759 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2760 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2761 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2762 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2763 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2764 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2765 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2766 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2767 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2768 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2769 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
#2770 0x0000000000405584 in operator<< (stream=..., what=...) at /home/jens/projects/testserver/testobject.cpp:15
Hast du eventuell eine Idee, wie ich das bewerkstelligen kann?

Verfasst: 9. Oktober 2010 13:14
von dazedly
Ich habe es jetzt einmal folgendermaßen probiert:

Code: Alles auswählen


QDataStream & operator << ( QDataStream & stream, const testObject & what )
 {
	stream << what.message << what.id;
	return stream;
}

QDataStream & operator >>(QDataStream& stream, testObject& what)
{
	stream >> what.message >> what.id;
	return stream;
}

Das funktioniert zwar, aber gibt es noch eine elegantere Lösung, als alles einzeln zu definieren?

Verfasst: 10. Oktober 2010 13:06
von Christian81
Nein