[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