Я использую getifaddrs() и inet_ntop(), чтобы получить IP-адреса в системе. Когда система настроена на IPv6, возвращаемый адрес находится в сокращенной версии (используя :: для нулей). Есть ли способ расширить этот адрес до полного?развернуть адрес IPv6, чтобы я мог его распечатать на stdout
Это код, я использую:
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);
код очень ценится.
EDIT:
Так как это, по-видимому очень трудно понять, я дам вам пример:
Если я получаю ABCD: 12 :: 3 Мне нужно, чтобы развернуть его на ABCD: 0012: 0000: 0000: 0000: 0000: 0000: 0003
Причина? потому что это часть требований. Просто как тот.
сокращенный вариант является действительным ipv6 адрес - так почему вы хотите, чтобы развернуть его? – Femaref
, потому что мне нужно его полностью сохранить в нашей базе данных. это требование. – Jessica
@Jessica: Вы храните его как 128-битное целое, правильно? Поскольку сохранение его в виде текстового представления несколько бессмысленно - есть IPv6-адреса, которые могут быть представлены многими способами именно из-за синтаксиса '::' сокращенного. – Piskvor