【问题标题】:TCP socket: When ntoh/hton conversion not needed?TCP 套接字:何时不需要 ntoh/hton 转换?
【发布时间】:2014-06-02 13:00:47
【问题描述】:

我正在使用现有代码,通过 TCP 连接传递数据 - union ibv_gid 而不转换字节序。里面有评论:"The gid will be transfer byte by byte so no need to do "hton"。代码是正确的并且有效,但我不明白为什么数据是逐字节传递的(实际上它们传递了整个结构)以及为什么不需要字节序转换。他们传递的数据类型是:

union ibv_gid {
        uint8_t                 raw[16];
        struct {
                uint64_t        subnet_prefix;
                uint64_t        interface_id;
        } global;
};

** 对于其他数据类型(如 int 等),它们确实会转换前后的数据

//VL_sock_sync_data function synchronizes between the two sides 
//by exchanging data between the two sides.
//size bytes are being copied from out_buf to the other side, and being saved in in_buf.
rc = VL_sock_sync_data(sock_p, sizeof(union ibv_gid), &local_gid, &tmp_gid);

你能解释一下为什么不需要字节序转换吗? 感谢您的帮助

【问题讨论】:

  • 如果两个对等主机具有相同的字节序,结构成员对齐规则,成员间填充!成员大小和整体结构大小,按位复制就足够了。由于其中许多参数取决于编译器、编译器版本、使用的编译器标志以及周围的#pragmas,因此您可以看到将结构用作网络协议确实非常危险。

标签: c sockets htonl


【解决方案1】:

这里的原因似乎是这里不需要进行字节顺序转换,因为 GID(以其规范表示)不是两个 64 位整数。它是 16 个字节。

复杂之处在于,具有不同字节序的两个系统将在subnet_prefixinterface_id 字段中看到不同的值。因此,如果他们要将这些值写入字符串,来回发送字符串并比较它们,那将是一个问题。如果他们要根据哪个具有更大的subnet_prefix 来比较 GID,并期望系统之间的比较相同,那将是一个问题。如果一个只生成连续的interface_ids,而另一个期望它们是连续的,那将是一个问题。但只要它们只用作不透明的字节数组,就没有问题。

【讨论】:

  • 我的想法完全一致,将这些 int 类型添加到 union 似乎真的有问题,因为它们的解释可能会因字节顺序而异。
  • @FelixFrank 同意了。我怀疑这只是将 GID 分成两个字段,并允许在每个字段内进行无功能的相等比较,但这是一个糟糕的权衡。
猜你喜欢
  • 1970-01-01
  • 2015-05-18
  • 2014-02-08
  • 2013-12-29
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 2016-05-14
  • 2020-07-02
相关资源
最近更新 更多