2016-08-09 118 views
1

Ich scheine schlechte IPv6-Zeichenketten von inet_ntop zurück, vor allem mit Adressen, wo es versucht, Sequenzen von Nullen zugunsten von "::" fallen zu lassen.inet_ntop Drucken falsche IPv6-Adresse

Hier ist der Code;

#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; 
} 

Wenn ich dies ausführen, bekomme ich die folgende Ausgabe;

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

Das sieht ziemlich falsch zu mir aus und ich hätte etwas wie erwartet;

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

Weiß jemand, was damit falsch ist?

Danke

+3

[Beachten Sie die Byte-Reihenfolge!] (Http://linux.die.net/man/3/htons) – Phillip

Antwort

4

Der Kommentar, achten Sie auf Byte-Reihenfolge ist korrekt. Sie sollten auch die für die IP-Adresse wirklich verwenden. Hier ist ein Beispiel initialisiert, dass als Folge von Bytes, die die erwarteten Ausgabe gibt:

#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 Ergebnisse in: address = e0e0:e0e0:f0f0:f0f0::1

Hier ist ein kurzes Beispiel der Byte-Reihenfolge auf einem x86-Computer zu vergleichen:

#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; 
} 

Gibt die Ausgabe:

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 

Die Beispielwörter von sich wiederholenden Bytes wie 0xe0e0e0e0 machen Ihnen keinen Gefallen, wenn Sie versuchen, diese Art von Problemen zu debuggen, 0x01020304 würde Ihnen eine viel bessere Vorstellung davon geben, was falsch gelaufen ist.

3

Dies ist Netzwerk-Byte-Reihenfolge Problem. Probieren Sie diesen Code aus.

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);