Seite 1 von 1
QString über QTcpSocket [gelöst]
Verfasst: 29. April 2009 00:05
von speedy
Hallo
ich würde gerne ein QString über QTcpSocket senden.
Momentan kommt das auch in meinem anderen Programm an.
Code: Alles auswählen
int i;
for (i = 0; i < socketlist.size(); i++)
{
socketlist.at(i)->write(QString("Ping").toUtf8());
}
}
Im anden Programm sehe ich das erstmal als Hex.
Aber eine Prinzipielle Frage hab ich da...
ist das besser mit ".toUtf8()" oder mit ".toAscii()" oder mit ".toLatin1()" ?
oder ist das eine Glaubensfrage ...
mfg speedy
Verfasst: 29. April 2009 06:38
von Christian81
Es kommt drauf an was Du schickst - wenn es nur ASCII-Daten sind reicht .toAscii(). Am sinnvollsten ist natürlich utf-8. Kommt allerdings auch drauf an ob spezifiziert wurde was gesendet werden soll.
Verfasst: 29. April 2009 13:04
von speedy
hmm ich glaub es wird was komplizierter.
Ich muss warscheinlich 2 * int, 1 QString und 2*bool verschicken.
Überleg mir jetzt erstmal wie ich das sinvoll in ein QByteArray packe.
Vielleicht schreib ich noch die versendete länge am Anfang mit rein...
Verfasst: 29. April 2009 16:08
von gerome69
Wie wäre es, das ganze in ein XML zu packen und in einem Rutsch als Bytearray zu schicken und auf der anderen Seite wieder zu dekodieren?
<data>
<myString>Der String</myString>
<myInt>1234</myInt>
</data>
Gruß, Gérôme
Verfasst: 30. April 2009 01:15
von speedy
Naja ich habs jetzt etwas anders gelöst.
Aber Ähnlich.
Ich Packe alles in ein QString
Jedes Datenpaket hat ein <START> und ein <END>
dazwischen hab ich meine Daten jeweils mit einem * getrennt.
Mein QString hat sonst auch keine * Zeichen, daher ist das kein Problem.
Hab nur gemerkt das manchmal mehr als nur ein Datenpaket auf einmal ankommt.
Muss nur noch den Teil der da zwischen kommt an den * dingern wieder auseinander schneiden und noch checks machen ob das vernünftige Daten sind.
Sollte ich noch Checksummen machen?
Oder ist das ein wenig übertrieben ...
Verfasst: 30. April 2009 03:43
von speedy
so geschafft.
Die Daten werden jetzt richtig erkannt und können somit auch das SIGNAL in meinem Client starten ^^
Das sollte doch erstmal langen für heute.
... oh man schon 4 Uhr ... mein Bett ruft schon.
Code: Alles auswählen
QByteArray einzeldata;
printf ("es kommen Daten an:\n");
QByteArray bytedata = socket->readAll();
bytedata = bytedata.trimmed();
//QString rohdaten = QString::fromUtf8(bytedata);
//ausgabefeld->append(rohdaten);
int startpos,endpos;
while (bytedata.size() > 0)
{
startpos = bytedata.indexOf("<START CAN>");
endpos = bytedata.indexOf("<END CAN>");
printf("startpos = %i endpos = %i\n",startpos,endpos);
if ( (startpos > -1) && (endpos > startpos) )
{
einzeldata = bytedata.mid(startpos + 11, endpos - startpos - 11);
bytecaninterpreter(einzeldata);
if (bytedata.size() > (endpos + 9))
{
bytedata = bytedata.right(bytedata.size() - endpos - 9);
}
else bytedata.clear();
}
else
{
ausgabefeld->append("ERROR: Incompatible Daten per TCP empfangen. Daten werden verworfen");
// ausgabefeld->append(QString::fromUtf8(bytedata));
printf("Incompatible Daten per TCP empfangen!!! Daten werden verworfen.\n");
bytedata.clear();
}
}
Edit:
hmm ... anscheinend geht meine PC Uhr vor ... ist ja erst 3:49