2016-04-14 6 views
0

У меня есть структура addrinfo, что я получаю, вызвав getaddrinfo() функцию со следующими параметрами:Как сохранить адрес IPv6 из getaddrinfo в массив символов?

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

Мне нужно сохранить адрес IPv6 в двоичном виде и распечатать его в шестнадцатеричном виде.

Мой вопрос: как сохранить адрес IPv6 в массиве символов из 16 элементов?

+1

Что вы подразумеваете под "store [something] in binary form"? Все в компьютере двоично. – immibis

+0

Я хотел сделать различие, чтобы не использовать inet_ntop, чтобы очистить путаницу, так как мне нужен результат в шестнадцатеричной форме. – Kuyss

ответ

3

Если вызов getaddrinfo был успешным, то res содержит связанный список доступных struct addrinfo, в котором вы можете получить ipaddress со своим членом ai_addr. Если ai_family является AF_INET6, то вы можете скопировать ipv6 адрес следующими:

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

Чтобы сбросить байты адреса:

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

Чтобы напечатать ipv6 адрес в каноническим образом, использовать inet_ntop:

char str[64]; 
printf("%s\n", inet_ntop(AF_INET6, buf, str, sizeof buf)); 
+1

Да, исправлено это. :) – fluter

0

После того как вы сохранили адрес в буфер, вы можете сделать это для шестнадцатеричного вывода.

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]); 
} 
Смежные вопросы