[Qt-interest] QTcpSocket & QDataStream

Andre Somers andre at familiesomers.nl
Sat Feb 5 16:19:01 CET 2011


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 <mailto: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 <mailto: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/20110205/16363eef/attachment.html 


More information about the Qt-interest-old mailing list