#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
int main(int argc, char **argv) {
unsigned long addr;
unsigned long net_id;
struct sockaddr_in address;
addr = inet_addr("192.168.50.25");
// prints 1932A8C0 in host byte-order which in this case is little-endian
printf("IP-Address in Host-Byte Order: %08X\n", (unsigned int) addr);
// zero the struct out
memset(&address, 0, sizeof address);
// copy address into the struct
memcpy(&address.sin_addr.s_addr, &addr, sizeof addr);
// inet_netof returns the network ID in host byte order
net_id = inet_netof(address.sin_addr);
// prints 00C0A832 Why not 0032A8C0?
printf("Network ID in Host-Byte-Order: %08X\n", (unsigned int) net_id);
return 0;
}
我有一个小端机器,所以主机字节顺序是小端。 IP地址192.168.50.25以主机字节顺序为0x1932A8C0。这对我来说很明显。
现在,inet_netof函数以host-byte-order的形式返回地址192.168.50.25的networkID。输出为0x00C0A832。这让我很困惑。对我来说,这看起来并不像是小端。如果我将其转换为点分十进制,则为:0.192.168.50。
我原本假设网络ID在little-endian中看起来像这样:0.50.168.192或0x0032A8C0十六进制而不是inet_netof()返回0x00C0A832。
为什么inet_netof()返回0x00C0A832而不是0x0032A8C0?
答案 0 :(得分:1)
inet_addr()
返回网络字节顺序。inet_netof()
返回主机字节顺序,即Little-endian。由于您的计算机是Little-endian,inet_netof()
返回的字节与inet_addr()
返回的输出相比,顺序相反。供参考,请参阅man 3 inet
。
答案 1 :(得分:1)
0x00C0A832
是0.192.168.50
。
它是以主机字节顺序和正确的值。
文档中的措辞有点模糊(“返回网络地址的网络号码部分”),但是如果我检查implementation,那就是右移,所以一切似乎都没问题。