Seite 1 von 1

Daten über QTcpSocket

Verfasst: 22. Februar 2011 10:07
von ChaosRabbit
Hallo,

ich habe ein Problem mit dem QTcpSocket. Ich möchte eine Datenstruktur über den Socket versenden, habe bis ejtzt aber nur beispiele dafür gefunden einen QString oder eine QPixmap zu verschicken.
(ich habe noch nicht mit Sockets gearbeitet vorher)

mein Code bis jetzt:

Code: Alles auswählen

void ReplayCtrl::ConnectSocket()
{
	QString error;
	QString host = "localhost";
	int port = 5000;
	socket->connectToHost(host, port, QIODevice::ReadWrite);
	if (socket->waitForConnected(1000))
		qDebug("Connected!");
	else
		error = socket->errorString();

	QDataStream out(&block, QIODevice::WriteOnly);
	out.setVersion(QDataStream::Qt_4_6);

	//out << replayCtrlStruct;

	out.device()->seek(0);
	out << (quint16)(block.size() - sizeof(quint16));

	try
	{
		socket->write(block);
		if ( !socket->waitForBytesWritten(-1) )
		{
			return;
		}
	}
	catch(...)
	{
		return;
	}
}
(block ist ein QByteArray im header deklariert)
Das auskommentierte "out << replayCtrlStruct" ist die Zeile, wo ich denke das es in etwa so zu lösen ist.

replayCtrlStruct möchte ich über den Socket verschicken. Es sieht so aus:

Code: Alles auswählen

typedef struct
{
  States_E          stateRun; 
  States_E          stateRepeat; 
  ModeOfOperation_E modeOfOperation;
  TypesOfPulse_E    typesOfPulse;
  float             timeStart;
  float             timeStop;
  RecordingTyp_T    recordPara[MAX_RECORDING_ELEM]; 
  unsigned int      numOfChars; 
  char              stringSource[MAX_STRLEN_SOURCE];
}ReplayCtrlIf_T;
in dem Struct sind Enums, andere Structs, floats und ein char array enthalten.

Wie kann ich das über einen Socket schicken?

Verfasst: 22. Februar 2011 10:55
von franzf
Es sollte eigentlich reichen, wenn du passende operator<< und operator>> anbietest.
Siehe z.B. hier:
http://www.civilnet.cn/book/embedded/gu ... 1sec1.html

Verfasst: 22. Februar 2011 11:16
von RHBaum
Wie kann ich das über einen Socket schicken?
schmutzige Loesung:

dein struct nutzt keinen dynamischen weiteren speicher, sondern deine structur ist fix. Du kannst also das Speicherabbild 1:1 rueberschicken (binaermode)

Code: Alles auswählen

// myStruct ist ne variable von ReplayCtrlIf_T
// out ist dein QDataStream 

//  out.device()->seek(0);  solltest du nie brauchen / schreiben ! 
out.writeBytes(reinterpret_cast<const char * >(&myStruct),sizeof(ReplayCtrlIf_T)); 

lesen auf der anderen seite geht dann aeqivalent

Code: Alles auswählen

// myStruct ist ne variable von ReplayCtrlIf_T
// in ist dein QDataStream 

in.readBytes(reinterpret_cast<char * >(&myStruct),sizeof(ReplayCtrlIf_T)); 

Funktioniert nur, wenn die speicherausrichtung deines Structs auf beiden seiten gleich ist ... ByteAlignment etc ...
Kann also selbst bei gleichem Compiler aber inkompatiblen Flags in die Hose gehen. Unterschiedliche "Versionen" deines structs sind dann eh ne Zeitbombe.
Dafuer hasst am wenigsten overhaed.

Besserer und sicherer weg bei TCP/IP ist Text zu schicken ....
Also dein Packet da oben und alles andere in ein Textformat zu konvertieren. Wird langsamer aber kompatibel auf allen plattformen wenns sein muss ....


Ciao ...

Verfasst: 22. Februar 2011 13:10
von ChaosRabbit
Danke für die Hilfe ! =)