将结构转换为要传递给 UDP 的常规消息格式
converting struct to general message format to be passed to UDP
我有一个C++ struct
用于在服务器之间交换update packet
,另一个struct
来实现有关neighbor
的信息,并且update packet
内部有struct neighbor
vector
。
struct neighbor;
struct update_packet {
uint16_t num_update_fields;
uint16_t port;
uint32_t IP;
vector<struct neighbor> neighbors;
update_packet(char * IPstr, int port) :
num_update_fields(num_nodes),
IP(IP_to_int(IPstr)), port((uint16_t) port)
{ };
};
struct neighbor {
uint32_t IP;
uint16_t port;
int16_t nil;
uint16_t server_id;
uint16_t cost;
neighbor(char * IPstr, uint16_t port, uint16_t server_id, uint16_t cost) :
IP(IP_to_int(IPstr)), port(port), nil(0),
server_id(server_id), cost(cost) { };
};
我想通过UDP
套接字在general message format
中交换这个结构(例如IP datagram
),并在接收端读取消息中的信息。
我怎样才能做到这一点?我的struct
设计对于我的目的来说是一个糟糕的设计吗?
你要问的是序列化。 最简单的是,如果你有一个POD类型,并且知道两端的机器是相同的类型,你可以投射和发送:
struct Foo {
uint32_t a;
uint16_t p;
};
Foo f { 1, 2 };
sendto(targetFD, reinterpret_cast<const char*>(&f), sizeof(f), 0);
由于矢量的原因,您的结构不能以这种方式使用。 向量中的数据是动态分配的,因此它不会与结构的其余部分一起布局。 如果您需要这样的可变长度字段,数组(或 std::array)以及元素数量的指示器将很有用。
像这样的铸造结构速度很快,但并不是真正的便携式。 如果您希望能够传递到其他语言或平台,则更喜欢序列化格式。 Google的Protocol Buffers(https://code.google.com/p/protobuf/)和其他几个序列化库旨在实现这一点。
本文介绍了更多的 c++ 样式序列化和反序列化 - https://rodgert.github.io/2014/09/09/type-driven-wire-protocols-with-boost-fusion-pt1/
相关文章:
- 从udp接收帧对于人脸识别来说太慢
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- boost::asio UDP 广播客户端仅接收"fast"数据包
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- NodeJs 服务器充斥着 UDP 广播,不发送响应
- 如何通过UDP接收QByteArray并将其解析为位字段结构?
- WinAPI 检查窗口是否具有常规标题栏
- 发送固定大小的 UDP 数据包
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- 使用 UDP 中断 while()-循环
- 如何在 2 台主机之间保持 UDP 套接字连接打开
- 具有使用 UDP 套接字字节的限制的标头
- 将矢量设置为常规参数
- 在 Linux 中关闭 UDP 套接字后,recv 不会返回
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- C++:将 UDP 袜子转移到新位置
- 将通用Windows应用程序转换为VisualStudio 2019上的常规应用程序
- 将结构转换为要传递给 UDP 的常规消息格式