自定义缓冲区的字节顺序

问题描述 投票:1回答:1

我想发送具有此结构的有效负载:

uint8_t  num_of_products;
//1 product
   uint8_t  action;
   time_t unix_time;//uint64_t
   uint32_t name_len;//up to 256
   char* name;
   uint8_t num_of_ips;
   //1 ip out if num_of_ips
      uint8_t ip_ver; //0 error , 1 ipv4 , 2 ipv6
      char* IP;// ipv4 : 4 , ipv6 : 16

在发送数据包之前,我使用memcpy将产品聚合成巨型mbuf

从测试我做name_len必须通过hton才能在wireshark中看起来“倒”。

我的问题是,我可以应用什么逻辑来获得具有未知大小的内部变量的自定义结构的字节顺序

什么应该通过什么应该留下的原因

c++ c networking
1个回答
2
投票

如果您的目标是以网络字节顺序(大端字节)显示消息,则只有占用多个字节的整数字段才需要htonl treamnet。在你的情况下,那将是time_t unix_timeuint32_t name_len。您的字符串和单字节字段(例如num_of_products)不需要任何特定的转换。

正如您问题中的一些评论者所建议的那样 - 如果您想使用严格的网络字节顺序,那将由您决定。如果您希望代码在不同平台上运行,那么将消息序列化以具有严格的字节顺序非常有用。

编写有效的字节打包代码非常困难。最后编写了大量代码,以节省几个字节的网络带宽。

用户jxh提到JSON是您邮件的可能编码。不知道为什么他删除了他的答案,因为它是关键。但无论如何,在wireshark和调试时,JSON或XML(或任何ascii文本模式)的标准消息传递格式更容易被观察到100倍。

© www.soinside.com 2019 - 2024. All rights reserved.