J'utilise getifaddrs() et inet_ntop() pour obtenir les adresses IP sur le système. Lorsque le système est défini sur IPv6, l'adresse renvoyée est dans la version abrégée (en utilisant :: for zeros). Est-il possible d'étendre cette adresse à une adresse complète?développez une adresse IPv6 afin que je puisse l'imprimer sur stdout
Ce code J'utilise:
struct ifaddrs *myaddrs, *ifa;
void *in_addr;
char buf[64];
if(getifaddrs(&myaddrs) != 0)
{
perror("getifaddrs");
exit(1);
}
for (ifa = myaddrs; ifa != NULL; ifa = ifa->ifa_next)
{
if (ifa->ifa_addr == NULL)
continue;
if (!(ifa->ifa_flags & IFF_UP))
continue;
switch (ifa->ifa_addr->sa_family)
{
case AF_INET:
{
struct sockaddr_in *s4 = (struct sockaddr_in *)ifa->ifa_addr;
in_addr = &s4->sin_addr;
break;
}
case AF_INET6:
{
struct sockaddr_in6 *s6 = (struct sockaddr_in6 *)ifa->ifa_addr;
in_addr = &s6->sin6_addr;
break;
}
default:
continue;
}
if (!inet_ntop(ifa->ifa_addr->sa_family, in_addr, buf, sizeof(buf)))
{
printf("%s: inet_ntop failed!\n", ifa->ifa_name);
}
else
{
printf("IP address: %s\n", buf);
}
}
freeifaddrs(myaddrs);
code
est très apprécié.
EDIT:
Comme il est apparemment très difficile à comprendre, je vais vous donner un exemple:
Si je ABCD: 12 :: 3 Je dois l'étendre à ABCD: 0012: 0000: 0000: 0000: 0000: 0000: 0003
La raison? parce que cela fait partie des exigences. Aussi simple que cela.
la version abrégée est une adresse ipv6 valide - alors pourquoi voudriez-vous développer? – Femaref
parce que je dois le stocker dans notre base de données. c'est l'exigence. – Jessica
@Jessica: Vous le stockez comme un entier de 128 bits, correct? Parce que le stocker en tant que représentation textuelle est légèrement inutile - il existe des adresses IPv6 qui peuvent être représentées de plusieurs façons, précisément en raison de la syntaxe raccourcie '::'. – Piskvor