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);但是我不正确地使用此功能,或者该功能是否有替代方法?
谢谢您的帮助。
它几乎总是错误的,通过网络发送一个的裸结构,因为你不能保证它是如何包装的东西-是成员之间有填充物,什么是字节顺序,是否有任何额外的内部字段,你是不知道的?仅当接收方在同一平台上运行相同的二进制文件时,才可以这样做。鉴于胖二进制文件,仅运行相同的二进制文件本身是不够的。
正确的方法是使用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)
我将在有关同一主题的另一个答案中提供更多详细信息。
| 归档时间: |
|
| 查看次数: |
2302 次 |
| 最近记录: |