inet_ntop打印错误的IPv6地址

时间:2016-08-09 10:30:08

标签: c

我似乎从inet_ntop中找回了糟糕的IPv6字符串,尤其是在尝试删除零序列以支持“::”的地址时。

这是代码;

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

int main (void)
{
    uint32_t ip[4] = {0xe0e0e0e0, 0xf0f0f0f0, 0x0, 0x1};
    char addr[INET6_ADDRSTRLEN] = "";

    inet_ntop(AF_INET6, ip, addr, INET6_ADDRSTRLEN);
    printf("address = %s",addr);
    return 0;
}

当我运行时,我得到以下输出;

address = address = e0e0:e0e0:f0f0:f0f0::100:0

这对我来说看起来很不对,我希望会有类似的东西;

address = e0e0:e0e0:f0f0:f0f0::1

有谁知道这有什么不对吗?

由于

2 个答案:

答案 0 :(得分:4)

注释,注意字节顺序是否正确。您还应该使用struct in6_addr作为IP地址。这是一个初始化的例子,它作为一个字节序列,给出了预期的输出:

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

int main (void)
{
    const struct in6_addr ip = { 0xe0, 0xe0, 0xe0, 0xe0,
                                 0xf0, 0xf0, 0xf0, 0xf0,
                                 0x00, 0x00, 0x00, 0x00,
                                 0x00, 0x00, 0x00, 0x01 };
    //const uint32_t ip[4] = { 0xe0e0e0e0, 0xf0f0f0f0, 0x0, 0x1 };
    char addr[INET6_ADDRSTRLEN];

    inet_ntop(AF_INET6, &ip, addr, INET6_ADDRSTRLEN);
    printf("address = %s",addr);
    return 0;
}

gcc main.c && ./a.out会产生:address = e0e0:e0e0:f0f0:f0f0::1

这是一个比较x86机器上字节顺序的简单示例:

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

int main (void)
{
    const struct in6_addr ip_uint8 = { 0xe0, 0xe0, 0xe0, 0xe0,
                                       0xf0, 0xf0, 0xf0, 0xf0,
                                       0x00, 0x00, 0x00, 0x00,
                                       0x00, 0x00, 0x00, 0x01 };
    const uint32_t ip_uint32[4] = { 0xe0e0e0e0, 0xf0f0f0f0, 0x0, 0x1 };
    char addr[INET6_ADDRSTRLEN];

    inet_ntop(AF_INET6, &ip_uint8, addr, INET6_ADDRSTRLEN);
    printf("address = %s\n",addr);

    unsigned char* b = (unsigned char*)&ip_uint8;
    printf("address bytes uint8 :");
    for( int i=0; i<16; i++) {
      printf(" %2.2X", b[i]);
    }
    printf("\n");

    b = (unsigned char*)&ip_uint32;
    printf("address bytes uint32:");
    for( int i=0; i<16; i++) {
      printf(" %2.2X", b[i]);
    }
    printf("\n");

    return 0;
}

给出输出:

address = e0e0:e0e0:f0f0:f0f0::1
address bytes uint8 : E0 E0 E0 E0 F0 F0 F0 F0 00 00 00 00 00 00 00 01
address bytes uint32: E0 E0 E0 E0 F0 F0 F0 F0 00 00 00 00 01 00 00 00

0xe0e0e0e0这样的重复字节的示例单词在尝试调试这些类型的问题时不会对您有任何好处,0x01020304可以让您更好地了解出现了什么问题。< / p>

答案 1 :(得分:3)

这是网络字节顺序问题。试试这段代码。

char addr[INET6_ADDRSTRLEN] = "";
uint32_t ip[4] = {0xe0e0e0e0, 0xf0f0f0, 0x0, 0x1};
for(i=0;i<4;i++)
{
    ip[i] = htonl(ip[i]);
}
inet_ntop(AF_INET6, ip, addr, INET6_ADDRSTRLEN);
printf("address = %s\n",addr);