套接字中的网络字节顺序

时间:2015-01-31 16:21:22

标签: c sockets integer send

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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