C++ UDP 发送变长度的数据
时间: 2024-09-25 18:21:12 浏览: 45
在C++中发送变长数据通过UDP(用户数据报协议)通常涉及到自定义数据包结构和手动管理网络字节序。因为UDP是无连接的,每个数据包都是独立传输的,所以你需要包含消息长度信息以保证接收方能够正确解析。
以下是一个简单的示例,展示如何创建一个变长数据包:
```cpp
#include <string>
#include <vector>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
// 定义一个数据包结构,包含长度和实际数据
struct DataPacket {
uint16_t length;
std::string data;
};
// 数据包的序列化和反序列化函数
void pack(DataPacket* packet, char* buffer) {
// 将长度存入小端字节顺序
uint16_t len = htons(packet->length);
memcpy(buffer, &len, sizeof(len));
buffer += sizeof(len); // 移动到下一个位置
// 复制数据到缓冲区
memcpy(buffer, packet->data.c_str(), packet->length);
}
DataPacket unpack(char* buffer) {
DataPacket packet;
// 从缓冲区读取长度并转换回主机字节顺序
uint16_t len = ntohs(*reinterpret_cast<uint16_t*>(buffer));
buffer += sizeof(len);
// 复制数据
packet.length = len;
packet.data = std::string(buffer, len);
return packet;
}
int main() {
// 创建套接字、设置选项等...
int sock = create_socket();
// 示例数据包
DataPacket dp = {100, "Hello, UDP!"};
char buffer[256];
pack(&dp, buffer); // 序列化数据到缓冲区
// 发送数据
sendto(sock, buffer, dp.length + sizeof(dp.length), 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr));
// 关闭套接字
close(sock);
return 0;
}
```
阅读全文