套接字中的网络字节顺序

我正在学习c(Linux)中的套接字编程,我无法理解为什么在发送整数时需要使用htonl,而不是在发送字符串(char *)时。 我读过很多论文,但我仍然不知道为什么。

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

假设您short 0x9FD3。 在Small Endian平台上,它将作为0xD39F存储在内存中。 第一个字节是0xD3,下一个字节是0x9F。 如果您将其发送到默认情况下使用Big Endian的计算机,它将被解释为0xD39F(54,1475),而不是0x9FD3(40,915)。 另一方面,字符串保持为字符数组,这是为了开始。 如果你有“aString”,它将被存储为“a”,“S”,“t”,“r”……在内存中,因为1个字符是1个字节宽。 只有多个字节的数据类型将以相反的顺序存储在小端平台上,使转换毫无意义

不同的计算机具有不同的字节顺序 。 字节顺序主要适用于占用多个字节的变量(这就是为什么你通常 – 并不总是 – 使用整数而不是字符,因为通常char占用一个字节)。 关于字节序的阅读模式,你应该更清楚。 就像我说的那样,在发送整数时没有必要使用htonl,但它通常已经完成,同意一个“通用”表示,因为你可能不知道endianness目标机器将具有什么。 这样,客户端和服务器都同意将数字编码为某种特定的字节序 – 这样他们就可以在需要时更改字节顺序。