这是一个相当基本的问题,令我惊讶的是,我今天遇到了一个问题。
在我看来,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。
首先想到的是endianness,但我已经阅读了MSDN文档(1和2),没有提到字节顺序;在我看来,这些函数会任意决定使用其中一个符号,而没有明确说明这一点。
怎么一回事?
发布于 2015-05-10 16:48:08
Endianness 是的原因。
这些函数的全部目的不是产生一个“可读的”整数,而是设置一个32位的数量,可以在线路上发送出去。IPv4需要大端排序,所以我敢打赌,如果您执行printf("%02X\n", ((char *)&IP)[0]));,您将得到C0。
发布于 2015-05-10 16:58:02
大于字节大小的数量(短裤、整数等)必须按照因特网标准的要求以网络字节顺序离开,默认情况下是大端。
因此,这些函数,如inet_pton、inet_ntoa、htons、htonl和其他类似的函数,根据主机的权限,负责以这些数量交换字节。另一方面,接收方应使用相应的函数将网络字节顺序转换为正确的字节顺序。
https://stackoverflow.com/questions/30153966
复制相似问题