[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