我对
inet_pton()
函数感到困惑。根据 man 页面的描述,该函数将字符串src转换为af地址族中的网络地址结构,然后将网络地址结构复制到dst中。参数af必须是AF_INET或AF_INET6。 dst以网络字节序写入。因此该函数生成一个网络字节序的值。但我得到了以下代码: struct sockaddr_in a;
char sip[20];
inet_pton(AF_INET, "192.168.0.182", (void *)&a.sin_addr);
inet_ntop(AF_INET, (void *)&a.sin_addr, sip, 20);
printf("htonl:%08x\n", htonl(a.sin_addr.s_addr));
printf("inet_pton:%08x\n", a.sin_addr.s_addr);
printf("inet_ntop:%s\n", sip);
输出:
htonl:c0a800b6
inet_pton:b600a8c0
inet_ntop:192.168.0.182
inet_pton
输出为b6.00.a8.c0
,转换为182.0.168.192
。其输出与htonl
的输出不同。由于htonl
将主机字节顺序转换为网络字节顺序,因此如果inet_pton
生成网络字节顺序,则它们的输出应该相同。这是否意味着inet_pton
实际上生成主机字节顺序?如果inet_pton
已经生成网络字节顺序
,我为什么需要htonl
来获取正确的值?
s_addr
存储了inet_pton
函数的结果。根据 man 手册,该函数将值以网络字节序
的形式写入。这是否意味着s_addr
也是以网络字节序
的形式写入的呢? - 27Blendprintf("inet_pton:%08x\n", a.sin_addr.s_addr);
语句将会打印你传入的32位整数,它是以主机字节序为基准的,相对于网络字节序而言看起来是反过来的。虽然inet_pton函数确实会按照网络字节序存储字节,但是你的printf()语句却欺骗了你。 - nos