从TCP套接字

时间:2016-11-28 15:13:21

标签: c++ qt sockets tcp endianness

我必须从TCP套接字接收数据。它具有固定的16字节头(一个头的字段是数据长度)和数据。我用BigEndian收到它,但是它是用LittleEndian发送的。

我可以'找到这种数据接收的好方法。现在对我有用的是(阅读其中一个标题字段):

QByteArray packetType = tcpSocket->read(2);
QDataStream in(packetType);
in.setByteOrder(QDataStream::LittleEndian);
quint16 pT = 0;
in >> pT;

有没有更好的方法来设置QByteArray endianess? 或者用QDataStream读取指定字节数的方法?

1 个答案:

答案 0 :(得分:1)

你几乎做得对。中间QByteArray是不必要的。您可以直接在套接字上设置数据流:

QTcpSocket socket;
QDataStream in(&socket);
in.setByteOrder(QDataStream::LittleEndian);
...
void onReadyRead() {
  in.startTransaction();
  uint16_t packet_type;
  in >> packet_type;
  if (in.status == QDataStream::Ok) {
    if (packet_type == Foo) {
      uint32_t foo_data;
      in >> foo_data;
      if (! in.commitTransaction())
        return; // not enough data
      // got a full packet here
    }
  }
  in.abortTransaction();
}