QDataStream 和 QTcpSocket 上的发送和接收结构

Posted

技术标签:

【中文标题】QDataStream 和 QTcpSocket 上的发送和接收结构【英文标题】:QDataStream and sending & receiving structures over QTcpSocket 【发布时间】:2018-01-03 14:02:53 【问题描述】:

我对如何通过 QTcp 套接字接收和发送结构感到困惑。

in.startTransaction();

QBytearray data;
in >> data;

if (!in.commitTransaction())

    qDebug()  << "incomplete: " << data;
    return;

所以说我的数据包以字节为单位(01 00 00 68 65 6c 6c 6f)

构建我的结构,然后使用 qdatastream 运算符反序列化或序列化数据包数据......

我该怎么处理填充...

一些例子会有所帮助

【问题讨论】:

为什么要关心填充?您的问题是什么 - 不清楚您的问题是什么? 【参考方案1】:

struct 在内存中的布局是特定于编译器和架构的;不要试图让它与网络数据包中的字节完全匹配,而是在内存中的结构和网络数据包之间显式转换,即通过定义适当的流操作符

QDataStream &operator<<(QDataStream &, const YourClass &)
QDataStream &operator>>(QDataStream &, YourClass &)

这些操作符是如何实现的,显然取决于行上的数据和YourClass上的数据,不过给大家举个简单的例子

struct S  int a , b ;

QDataStream &operator<<(QDataStream &stream, const S &s) 
    stream << s.a << s.b;
    return stream;


QDataStream &operator<<(QDataStream &stream, S &s) 
    stream >> s.a >> s.b;
    return stream;

将序列化和反序列化自定义结构 S;

【讨论】:

如何处理网络数据包中的空字节?其中一些可能是 100+ 字节或更多,具体取决于设备卡。你发布的就是我所做的。所以对 Stream 的任何调用都会自动将其发送到套接字,我不必将其写入 IO 套接字... 那么你是同时读取和写入数据包,还是只读取数据包?如果您都通过 QDataStream 进行读写,那么网络上的确切字节布局应该是无关紧要的,“它 100% 独立于主机的操作系统、CPU 或字节顺序”。 (见doc.qt.io/qt-5/qdatastream.html#details)。

以上是关于QDataStream 和 QTcpSocket 上的发送和接收结构的主要内容,如果未能解决你的问题,请参考以下文章

Qt mp3 文件到数据流

更正覆盖 QDataStream 运算符和链接问题

QDataStream和QByteArray

如何在 PySide 和 Python 3.X 中将字节写入 QDataStream?

Qt QSharedMemory 和 QDataStream

调整 QDataStream