套接字中的网络字节顺序

Network Byte Order in sockets

我正在学习用 c (Linux) 进行套接字编程,但我真的不明白为什么在发送整数时必须使用 htonl,而在发送字符串时却不需要(字符*)。看了很多论文,还是不知道为什么。

这是因为通过网络发送的数据是按照Big Endian顺序发送的。不同平台存储数据的顺序不同。

假设您有一个 short 的 0x9FD3。在 Small Endian 平台上,它将作为 0xD39F 存储在内存中。第一个字节是 0xD3,下一个字节是 0x9F。如果您将它发送到默认使用 Big Endian 的机器,它将被解释为 0xD39F (54,1475),而不是 0x9FD3 (40,915)。另一方面,字符串保存为字符数组,这是为了开始。如果您有 "aString",它将在内存中存储为 'a'、'S'、't'、'r'...,因为 1 个字符是 1 个字节宽。只有多字节的数据类型在small endian平台上会倒序存储,转换毫无意义