2016-04-14 10 views
0

Ich habe eine addrinfo Struktur, die ich durch den Aufruf der Funktion getaddrinfo() mit folgenden Parametern erhalten:Wie speichere ich eine IPv6-Adresse von getaddrinfo in ein Zeichen-Array?

getaddrinfo(address, NULL, &hints, &res)

ich die IPv6-Adresse in binärer Form speichern müssen und es in hexadezimale Form zu drucken.

Meine Frage ist, wie speicher ich die IPv6-Adresse in einem Zeichen-Array von 16 Elementen?

+1

Was meinen Sie mit "speichern [etwas] in binärer Form"? Alles in einem Computer ist binär. – immibis

+0

Ich wollte den Unterschied machen, inet_ntop nicht zu verwenden, um Verwirrung zu beseitigen, da ich das Ergebnis in Hex-Form brauche. – Kuyss

Antwort

3

Wenn getaddrinfo Aufruf erfolgreich war, enthält res eine verknüpfte Liste der verfügbaren Struktur addrinfo, in dem Sie die IP-Adresse mit seinem ai_addr Mitglied erhalten können. Wenn ai_family AF_INET6 ist, dann können Sie die IPv6-Adresse kopieren, indem Sie folgende:

unsigned char buf[16]; 
struct sockaddr_in6 *in6 = (struct sockaddr_in6*)addr->ai_addr; 
memcpy(buf, in6->sin6_addr.s6_addr, 16); 

die Bytes der Adresse dump:

for (int i = 0; i < 16; i++) { 
    printf("%02X", buf[i]); 
    if (i < 15) putchar(':'); 
} 

Um die IPv6-Adresse in kanonischer Weise zu drucken, verwenden inet_ntop:

+1

ja, das behoben. :) – fluter

0

Nach dem Speichern der Adresse in einem Puffer können Sie dies für die hexadezimale Ausgabe tun.

unsigned char buf[16]; 
memcpy(&buf, &addr, 16);` 

printf("0x"); 
int i; 
for(i = 0; i < 16; i++) 
{ 
     if(i && i % 2 == 0) 
     printf (":"); 
     printf("%02x", buf[i]); 
}