使用qt c++ 写一个 复杂结构体的 udp收发的自定义报文协议,给出使用实例和说明
时间: 2023-12-03 17:43:21 浏览: 196
基于QT的UDP广播程序报文
5星 · 资源好评率100%
好的,让我们来实现一个复杂结构体的 UDP 收发的自定义报文协议,包括报文头和报文体,以及一个使用实例。
首先,我们定义一个报文头结构体,包含以下字段:
```cpp
struct PacketHeader {
uint16_t magic; // 报文头魔数
uint16_t version; // 报文版本号
uint32_t length; // 报文总长度
uint32_t seq; // 报文序号
};
```
然后,我们定义一个报文体结构体,包含以下字段:
```cpp
struct PacketBody {
uint16_t type; // 报文类型
uint16_t reserved; // 保留字段
uint32_t timestamp; // 时间戳
std::vector<uint8_t> payload; // 报文负载数据
};
```
接下来,我们组合报文头和报文体,定义一个完整的报文结构体:
```cpp
struct Packet {
PacketHeader header; // 报文头
PacketBody body; // 报文体
};
```
现在,我们可以通过 UDP 套接字发送和接收这种自定义报文协议的数据了。下面是一个简单的使用实例:
```cpp
// 创建 UDP 套接字
int sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
perror("socket error");
exit(EXIT_FAILURE);
}
// 绑定本地地址和端口
struct sockaddr_in local_addr;
memset(&local_addr, 0, sizeof(local_addr));
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
local_addr.sin_port = htons(8888);
if (bind(sock, (struct sockaddr *)&local_addr, sizeof(local_addr)) < 0) {
perror("bind error");
exit(EXIT_FAILURE);
}
// 接收数据
Packet packet;
struct sockaddr_in peer_addr;
socklen_t peer_addr_len = sizeof(peer_addr);
int n = recvfrom(sock, &packet, sizeof(packet), 0, (struct sockaddr *)&peer_addr, &peer_addr_len);
if (n < 0) {
perror("recvfrom error");
exit(EXIT_FAILURE);
}
// 打印接收到的报文信息
printf("Received packet: magic=%u, version=%u, length=%u, seq=%u, type=%u, timestamp=%u, payload size=%zu\n",
packet.header.magic,
packet.header.version,
packet.header.length,
packet.header.seq,
packet.body.type,
packet.body.timestamp,
packet.body.payload.size());
// 发送数据
packet.header.magic = 0x1234;
packet.header.version = 1;
packet.header.length = sizeof(Packet);
packet.header.seq = 1;
packet.body.type = 2;
packet.body.timestamp = time(nullptr);
packet.body.payload = {0x01, 0x02, 0x03};
n = sendto(sock, &packet, sizeof(packet), 0, (struct sockaddr *)&peer_addr, peer_addr_len);
if (n < 0) {
perror("sendto error");
exit(EXIT_FAILURE);
}
// 关闭套接字
close(sock);
```
这个例子中,我们首先创建一个 UDP 套接字并绑定本地地址和端口,然后接收一个报文并打印出其中的字段,最后发送一个包含指定字段的报文。注意,我们使用了字节对齐来防止结构体在不同编译器上出现不一致的问题。
阅读全文