我正在使用getifaddrs()和inet_ntop()函数获取系统上的IP地址。当系统设置为IPv6时,返回的地址是缩写版本(使用::代替零)。有没有办法将该地址扩展为完整的地址?
这是我正在使用的代码:
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);
感激不尽您的代码。
编辑:
由于这显然非常难理解,我会给你一个例子:
如果我得到 abcd:12::3 ,我需要将其扩展为 abcd:0012:0000:0000:0000:0000:0000:0003
原因? 因为它是要求的一部分。就这么简单。
::
缩写语法。 - Piskvor left the building