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.
[Beachten Sie die Byte-Reihenfolge!] (Http://linux.die.net/man/3/htons) – Phillip