首页 > 解决方案 > 套接字写入小端

问题描述

我有以下 4 字节对齐的结构数据(根本没有填充),这些数据在通过 TCP 套接字发送之前被复制到 unsigned char * 缓冲区。发送方机器是 Little Endian 系统,接收方机器是 Big Endian 系统。

typedef struct {
    unsigned short  a;
    unsigned short  b;
} Struct;
Struct s;
s.a = 1;
s.b = 2;
...
memmcpy (buf, (unsigned char *)&s, sizeof (Struct));
write (sockfd, buf, sizeof(Struct));

在发送方系统上,我想象 sa 在内存中表示为 01 00 和 sb 02 00,因此发出的流是 01 00 02 00。我假设在这种情况下发送方正在发送 little endian 字节顺序网络而不是网络字节顺序。

由于接收器是大端系统,我的问题是:

  1. 发送方应按网络字节顺序发送(必须在 sa 和 sb 上调用 htons)
  2. 或者接收者应该通过调用 ntohs 来处理这个问题?

标签: socketsendianness

解决方案


这个问题没有单一的答案,两者都有先例:

  • 大多数 Internet 协议使用网络字节顺序,这意味着每一端都有一个代码路径,但当两台 little-endian 机器通信时可能需要不必要的字节交换。

  • CORBA IIOP 以主机字节顺序发送,以及一个指示哪个顺序的标志 - 如果标志与它们自己的本地顺序不同,客户端必须能够交换字节顺序。

在您的情况下,鉴于您知道主机具有不同的字节序,我建议您指定您的协议以使用网络字节顺序 - 这样您会让更少的人感到惊讶。


推荐阅读