套接字写入小端
Socket write little endian
我有以下 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));
在发送方系统上,我想象 s.a 在内存中表示为 01 00 和 s.b 02 00,因此发送的流是 01 00 02 00。我假设在这种情况下,发送方通过网络发送小端字节顺序而不是网络字节顺序。
由于接收方是Big Endian系统,我的问题是:
- 发送方应按网络字节顺序发送(必须在 s.a 和 s.b 上调用 htons)
- 或者接收方应该通过调用 ntohs 来处理这个问题?
这个问题没有单一的答案,两者都有先例:
大多数 Internet 协议使用网络字节顺序,这意味着每一端都有一个代码路径,但当两个小端机器通信时可能需要不必要的字节交换。
CORBA IIOP 以主机字节顺序发送,并带有一个标志以指示该顺序 - 如果标志与其自身的本机顺序不同,则客户端必须能够交换字节顺序。
在您的情况下,鉴于您知道主机的字节顺序不同,我建议您指定协议以使用网络字节顺序 - 这样您就不会感到惊讶。
我有以下 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));
在发送方系统上,我想象 s.a 在内存中表示为 01 00 和 s.b 02 00,因此发送的流是 01 00 02 00。我假设在这种情况下,发送方通过网络发送小端字节顺序而不是网络字节顺序。
由于接收方是Big Endian系统,我的问题是:
- 发送方应按网络字节顺序发送(必须在 s.a 和 s.b 上调用 htons)
- 或者接收方应该通过调用 ntohs 来处理这个问题?
这个问题没有单一的答案,两者都有先例:
大多数 Internet 协议使用网络字节顺序,这意味着每一端都有一个代码路径,但当两个小端机器通信时可能需要不必要的字节交换。
CORBA IIOP 以主机字节顺序发送,并带有一个标志以指示该顺序 - 如果标志与其自身的本机顺序不同,则客户端必须能够交换字节顺序。
在您的情况下,鉴于您知道主机的字节顺序不同,我建议您指定协议以使用网络字节顺序 - 这样您就不会感到惊讶。