[Qt-interest] QTcpSocket & QDataStream
pmqt71
pmqt71 at gmail.com
Mon Feb 7 16:03:30 CET 2011
Byte order is ok:
QDataStream in(pClientSocket);
in.setByteOrder(QDataStream::LittleEndian);
in.setVersion(QDataStream::Qt_4_0);
...
What happened (I believe) is that QByteArray over a QDataStream puts its
length at the begin of the stream, so I had 4 unexpected bytes on the other
side.
pm
2011/2/7 BRM <bm_witness at yahoo.com>
> 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
>
>
>
> _______________________________________________
> 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/cc085004/attachment.html
More information about the Qt-interest-old
mailing list