为什么inet_ntoa和inet_ntop"反向"字节?

时间:2015-05-10 16:44:17

标签: c networking winsock endianness

这是一个相当基本的问题,令我惊讶的是,我今天遇到了问题。

在我看来,inet_pton和inet_ntoa正在反转他们所给出的IP地址的字节:

DWORD IP;
inet_pton(AF_INET, "192.168.0.1", &IP);
printf("%08X\n", IP);

这将打印0100A8C0。好吧,如果我们分解字节,那就是它 01.00.A8.C0 = 1.0.168.192

类似地:

IP = 0x7F000001;
struct in_addr ia;
ia.S_un.S_addr = IP;

printf("%s\n", inet_ntoa(ia));

给了我1.0.0.127

首先想到的是字节序,但我已经阅读了MSDN文档(12)并且未提及字节顺序;对我来说,这些函数会随意决定使用其中一种符号而没有明确说明这一点,这似乎很奇怪。

发生了什么事?

2 个答案:

答案 0 :(得分:8)

Endianness 的原因。

这些功能的全部意义不在于产生一个可读的"整数,但设置32位数量,准备在线上运出。 IPv4需要大端排序,所以如果你做printf("%02X\n", ((char *)&IP)[0]));,我会下注,你得到C0

答案 1 :(得分:1)

大小超过一个字节的数量(短路,整数等)必须按照Internet标准的要求以网络字节顺序保留线路,默认情况下是Big-endian。

因此,这些函数(如inet_ptoninet_ntoahtonshtonl和其他类似函数负责根据主机的字节顺序交换这些数量的字节。另一方面,接收器应使用相应的函数将网络字节顺序转换为正确的字节顺序。