下面是一个使用Qt通过UDP协议发送结构体的示例代码:
#include <QtCore>
#include <QtNetwork>
// 定义一个结构体
struct MyStruct {
int id;
QString name;
};
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
// 创建UDP套接字
QUdpSocket udpSocket;
// 绑定本地IP和端口
udpSocket.bind(QHostAddress::LocalHost, 8888);
// 定义一个MyStruct类型的对象
MyStruct myStruct;
myStruct.id = 1;
myStruct.name = "Hello World!";
// 将myStruct序列化成QByteArray
QByteArray datagram;
QDataStream stream(&datagram, QIODevice::WriteOnly);
stream << myStruct;
// 发送数据报文到指定主机和端口
udpSocket.writeDatagram(datagram.data(), datagram.size(),
QHostAddress::LocalHost, 9999);
return app.exec();
}
在上述代码中,我们首先定义了一个名为MyStruct
的结构体。然后创建了一个QUdpSocket
对象并绑定了本地IP和端口。接着定义了一个MyStruct
类型的对象,并将其序列化成了QByteArray
。最后使用UDP套接字发送数据报文到指定的主机和端口。
如果要在另一台主机上接收这个数据报文,可以编写如下代码:
#include <QtCore>
#include <QtNetwork>
// 定义一个结构体
struct MyStruct {
int id;
QString name;
};
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
// 创建UDP套接字
QUdpSocket udpSocket;
// 绑定本地IP和端口
udpSocket.bind(QHostAddress::LocalHost, 9999);
QObject::connect(&udpSocket, &QUdpSocket::readyRead, [&]() {
while (udpSocket.hasPendingDatagrams()) {
// 从UDP套接字读取数据报文
QByteArray datagram;
datagram.resize(udpSocket.pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
udpSocket.readDatagram(datagram.data(), datagram.size(),
&sender, &senderPort);
// 将QByteArray反序列化成MyStruct对象
MyStruct myStruct;
QDataStream stream(datagram);
stream >> myStruct;
qDebug() << "Received: " << myStruct.id << ", " << myStruct.name;
}
});
return app.exec();
}
在上述代码中,我们创建了一个QUdpSocket
对象,并将其绑定到指定的主机和端口。然后使用readyRead()
信号来监听是否有数据可读,如果有就从UDP套接字中读取数据报文,并将其反序列化为MyStruct
类型的对象。最后输出接收到的结构体数据。
需要注意的是,发送方和接收方的结构体定义必须完全相同,包括变量名、类型和顺序等。因为这些信息都会被序列化和反序列化。