V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
samt42
V2EX  ›  Linux

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

  •  
  •   samt42 ·
    sam198542 · 2014-04-08 15:09:24 +08:00 · 5404 次点击
    这是一个创建于 3876 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    3 条回复    1970-01-01 08:00:00 +08:00
    ShadowStar
        1
    ShadowStar  
       2014-04-08 16:11:58 +08:00   ❤️ 1
    #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
        2
    samt42  
    OP
       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
        3
    ShadowStar  
       2014-04-09 13:48:29 +08:00
    @samt42 我这个代码的环境是OS X 10.9
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2762 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:34 · PVG 17:34 · LAX 01:34 · JFK 04:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.