[Qt-interest] QTcpSocket & QDataStream
BRM
bm_witness at yahoo.com
Mon Feb 7 15:37:11 CET 2011
First thing I think of when I see this kind of situation is byte alignment
compatibility.
There may be other things in play too, but any time you deal with a network
message you should ensure the message is aligned on single-byte boundaries.
Ben
From: Andre Somers <andre at familiesomers.nl>
>
>To: qt-interest at qt.nokia.com
>Sent: Sat, February 5, 2011 10:19:01 AM
>Subject: Re: [Qt-interest] QTcpSocket & QDataStream
>
> Op 5-2-2011 16:01, pmqt71 schreef:
>Both client and server run on my laptop. Same Qt version, compiler...
>>the setVersion is called in both sides on QDataStream
>>setVersion(QDataStream::Qt_4_0);
What is happening, is this. If you call:
ds << "hello";
then the character array "hello" is streamed in using the appropriate
function
QDataStream & QDataStream::operator<< ( const char * s )
As documented, this uses QDataStream::writeBytes, which, in turn, outputs a
32 bits int with the number of bytes, and then bytes themselves.
If you just want to output the bytes themselves, use int
QDataStream::writeRawData ( const char * s, int len ), or just don't use
QDataStream at all.
André
>
>2011/2/5 Andreas Pakulat <apaku at gmx.de>
>
>On 05.02.11 11:02:15, pmqt71 wrote:
>>> Hi,
>>>
>>> I'm sending data from a client to a server using QTcpSocket just
>>>as
>>> described in the fortune example. But when the server reads, it
>>>finds the
>>> data shifted by 4 bytes (in wich I find the length of the
>>>QByteArray used in
>>> the client side).
>>>
>>> Something similar happens in the following example.
>>>QByteArray::data (or
>>> constData) is the same used by QTcpSocket to write a
>QByteArray.
>>>
>>>
>>> *QByteArray ba;*
>>> *char *ss = NULL;*
>>> * *
>>> *QDataStream ds(&ba, QIODevice::WriteOnly);*
>>> *ds << "hello";*
>>> *ss = ba.data(); //ss is empty*
>>> *ss += 4; //ss contains "hello"*
>>>
>>> The first 4 bytes seems to contain the length of ba: 0,0,0,6
>>>
>>> If I don't use QDataStream I have no extra bytes:
>>> *QByteArray ba;*
>>> *char *ss = NULL;*
>>> * *
>>> *ba.append("hello");*
>>> *ss = ba.data(); //ss contains "hello"*
>>>
>>>
>>> I should skip the first 4 bytes before reading my data (that
>>>already contain
>>> a length), but I don't find the same instruction in the fortune
>>>example.
>>> Where is the problem in my code?
>>
>>
Are you using the same qt version to read the content as you use for
>>writing? Or maybe you don't use Qt at all for reading? QDataStream
>has
>>an internal data format which is being used to store the data you
put
>>into it into a list of bytes. This format is specific to QDataStream
>>and
>>may change between different Qt versions, hence you can specify
which
>>QDataStream format you want to use with the aproriate setter. So
make
>>sure that both sides use QDataStream to read the data and they use
>the
>>same data-format version.
>>
>>Andreas
>>
>>--
>>Beware of a tall blond man with one black shoe.
>>_______________________________________________
>>Qt-interest mailing list
>>Qt-interest at qt.nokia.com
>>http://lists.qt.nokia.com/mailman/listinfo/qt-interest
>>
>
>
>_______________________________________________
>Qt-interest mailing list
>Qt-interest at qt.nokia.com
>http://lists.qt.nokia.com/mailman/listinfo/qt-interest
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.qt-project.org/pipermail/qt-interest-old/attachments/20110207/8c2089bc/attachment.html
More information about the Qt-interest-old
mailing list