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 上的发送和接收结构的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PySide 和 Python 3.X 中将字节写入 QDataStream?