ipv6 地址能用 inet_pton 函数转成字节序么?

2014-04-08 15:09:24 +08:00
 samt42
inet_pton 在 ipv4 上没问题...
但是用在ipv6上就出问题了...
前两个IP转化出来的结果是一样一样的...第三个又不一样了...不知道问题出在哪...
IP1: 2a01:198:603:0:396e:4789:8e99:890f
IP2: 2a01:198:603:0::
IP3: 2a01::
IP1, IP2 结果都是 0x9801012a
IP3 结果是 0x12a 了

代码如下:

#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>

int main() {
struct in_addr ip;
char *addr1, *addr2, *addr3;

addr1 = strdup("2a01:198:603:0::");
addr2 = strdup("2a01:198:603:0:396e:4789:8e99:890f");
addr3 = strdup("2a01::");

inet_pton(AF_INET6, addr1, &ip);
printf("0x%x\n", ip.s_addr);

inet_pton(AF_INET6, addr2, &ip);
printf("0x%x\n", ip.s_addr);

inet_pton(AF_INET6, addr3, &ip);
printf("0x%x\n", ip.s_addr);
return 1;
}

结果:

0x9801012a
0x9801012a
0x12a
5398 次点击
所在节点    Linux
3 条回复
ShadowStar
2014-04-08 16:11:58 +08:00
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>

int main() {
struct in6_addr ip;
char *addr1, *addr2, *addr3;

addr1 = strdup("2a01:198:603:0::");
addr2 = strdup("2a01:198:603:0:396e:4789:8e99:890f");
addr3 = strdup("2a01::");

inet_pton(AF_INET6, addr1, &ip);
printf("0x%x%x%x%x\n", htonl(ip.__u6_addr.__u6_addr32[0]),htonl(ip.__u6_addr.__u6_addr32[1]),htonl(ip.__u6_addr.__u6_addr32[2]),htonl(ip.__u6_addr.__u6_addr32[3]));

inet_pton(AF_INET6, addr2, &ip);
printf("0x%x%x%x%x\n", htonl(ip.__u6_addr.__u6_addr32[0]),htonl(ip.__u6_addr.__u6_addr32[1]),htonl(ip.__u6_addr.__u6_addr32[2]),htonl(ip.__u6_addr.__u6_addr32[3]));

inet_pton(AF_INET6, addr3, &ip);
printf("0x%x%x%x%x\n", htonl(ip.__u6_addr.__u6_addr32[0]),htonl(ip.__u6_addr.__u6_addr32[1]),htonl(ip.__u6_addr.__u6_addr32[2]),htonl(ip.__u6_addr.__u6_addr32[3]));

return 1;
}
samt42
2014-04-08 18:39:49 +08:00
V2EX高手云集啊...
不知道是不是内核版本不一样.
我机器上的 in6_addr 结构里里面不是__u6_addr 而是 __in6_u.
所有输出改成了
printf("0x%x%x%x%x\n", htonl(ip.__in6_u.__u6_addr32[0]),htonl(ip.__in6_u.__u6_addr32[1]),htonl(ip.__in6_u.__u6_addr32[2]),htonl(ip.__in6_u.__u6_addr32[3]));
ShadowStar
2014-04-09 13:48:29 +08:00
@samt42 我这个代码的环境是OS X 10.9

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/107664

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX