【问题标题】:QDataStream and sending & receiving structures over QTcpSocketQDataStream 和 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 运算符反序列化或序列化数据包数据......

我该怎么处理填充...

一些例子会有所帮助

【问题讨论】:

  • 为什么要关心填充?您的问题是什么 - 不清楚您的问题是什么?

标签: qt sockets 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)。
猜你喜欢
  • 2013-02-21
  • 2011-07-04
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
相关资源
最近更新 更多