发送带有UDP协议和writeDatagram的结构

Eva*_*eil 2 c++ sockets qt udp

我的目标是通过UDP协议发送结构,我的问题是我用来执行此功能的功能与其参数中的结构不兼容。(我正在使用QT)

这是我编写的代码:

void MyUDP::sendUDP()
{
    typedef struct MyStructTag
    {
       int test1;
       bool test2;
       char test3;
    } MyStruct;

    MyStruct envoie;

    // Sends the datagram datagram
    // to the host address and at port.
    // qint64 QUdpSocket::writeDatagram(const QByteArray & datagram,
    //                      const QHostAddress & host, quint16 port)

    socket->writeDatagram(envoie, QHostAddress("10.100.14.79"), 4000);


}
Run Code Online (Sandbox Code Playgroud)

我知道这条线是完全错误的:socket->writeDatagram(envoie, QHostAddress("10.100.14.79"), 4000);但是我不正确地使用此功能,或者该功能是否有替代方法?

谢谢您的帮助。

Rei*_*ica 6

几乎总是错误的,通过网络发送一个的裸结构,因为你不能保证它是如何包装的东西-是成员之间有填充物,什么是字节顺序,是否有任何额外的内部字段,你是不知道的?仅当接收方在同一平台上运行相同的二进制文件时,才可以这样做。鉴于胖二进制文件,仅运行相同的二进制文件本身是不够的。

正确的方法是使用QDataStream序列化结构:

void MyUDP::sendUDP()
{
  struct MyStruct
  {
     int test1;
     bool test2;
     char test3;
  };
  MyStruct envoie;

  QByteArray buf;
  QDataStream s(&buf, QIODevice::WriteOnly);
  // The encoding is big endian by default, on all systems. You 
  // can change it if you wish.
  if (false) s.setByteOrder(QDataStream::LittleEndian);
  s << (qint32)envoie.test1 << (quint8)envoie.test2 << (qint8)test3;
  socket->writeDatagram(buf, QHostAddress("10.100.14.79"), 4000);
}
Run Code Online (Sandbox Code Playgroud)

我将在有关同一主题的另一个答案中提供更多详细信息。