这是一个相当基本的问题,令我惊讶的是,我今天遇到了问题。
在我看来,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文档(1和2)并且未提及字节顺序;对我来说,这些函数会随意决定使用其中一种符号而没有明确说明这一点,这似乎很奇怪。
发生了什么事?
答案 0 :(得分:8)
Endianness 是的原因。
这些功能的全部意义不在于产生一个可读的"整数,但设置32位数量,准备在线上运出。 IPv4需要大端排序,所以如果你做printf("%02X\n", ((char *)&IP)[0]));
,我会下注,你得到C0
。
答案 1 :(得分:1)
大小超过一个字节的数量(短路,整数等)必须按照Internet标准的要求以网络字节顺序保留线路,默认情况下是Big-endian。
因此,这些函数(如inet_pton
,inet_ntoa
,htons
,htonl
和其他类似函数负责根据主机的字节顺序交换这些数量的字节。另一方面,接收器应使用相应的函数将网络字节顺序转换为正确的字节顺序。