gpt4 book ai didi

c++ - 使用 UDP 协议(protocol)发送结构并写入数据报

转载 作者:搜寻专家 更新时间:2023-10-31 00:14:10 26 4
gpt4 key购买 nike

我的目标是通过 UDP 协议(protocol)发送一个结构,我的问题是我用来做它的函数与他的参数中的结构不兼容。 (我正在使用 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);


}

我知道这一行是完全错误的:socket->writeDatagram(envoie, QHostAddress("10.100.14.79"), 4000); 但是我不知道如何正确使用这个函数,或者是否有替代此功能的方法?

感谢您的帮助。

最佳答案

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

正确的做法是使用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);
}

我在 another answer 中提供了更多详细信息关于同一主题。

关于c++ - 使用 UDP 协议(protocol)发送结构并写入数据报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24156972/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com