套接字写小端

时间:2018-05-29 10:09:57

标签: sockets endianness

我有以下4字节对齐的struct数据(根本没有填充),在通过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.我假设在这种情况下发送方正在发送小端字节通过网络订购而不是网络字节顺序。

由于接收者是Big Endian系统,我的问题是:

  1. 发件人应该以网络字节顺序发送(必须在s.a和s.b上调用htons)
  2. 或者接收者应该通过呼叫ntohs来处理这个问题?

1 个答案:

答案 0 :(得分:1)

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

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

  • CORBA IIOP以主机字节顺序发送,并带有一个标志,指示是哪个顺序 - 如果标志与其本机顺序不同,则客户端必须能够交换字节顺序。

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