我正在使用现有代码,它通过TCP连接传递数据 - union ibv_gid
,而不转换字节序。内部有评论:"The gid will be transfer byte by byte so no need to do "hton"
。代码是正确的并且有效,但我不明白为什么数据是逐字节传递的(实际上它们传递整个结构)以及为什么没有必要进行endianess转换。他们传递的数据类型是:
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);
您能解释一下为什么没有必要进行字节顺序转换? 感谢您的帮助
答案 0 :(得分:4)
这里的推理似乎是这里不需要进行字节序转换,因为GID(在其规范表示中)不是两个64位整数。它是16个字节。
复杂的是,具有不同字节序的两个系统会在subnet_prefix
和interface_id
字段中看到不同的值。因此,如果他们要将这些值写入字符串,来回发送字符串,并进行比较,那将是一个问题。如果他们要根据哪一个具有更大的subnet_prefix
来比较GID,并且预期系统之间的比较是相同的,那将是一个问题。如果一个只生成连续interface_id
s,而另一个预期它们是连续的,那将是一个问题。但只要它们只被用作不透明的字节数组,就没有问题了。