扩展一个IPv6地址,以便我可以将其打印到stdout

我正在使用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

原因?因为这是要求的一部分。就那么简单。

回答:

void ipv6_to_str_unexpanded(char * str, const struct in6_addr * addr) {

sprintf(str, "%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x",

(int)addr->s6_addr[0], (int)addr->s6_addr[1],

(int)addr->s6_addr[2], (int)addr->s6_addr[3],

(int)addr->s6_addr[4], (int)addr->s6_addr[5],

(int)addr->s6_addr[6], (int)addr->s6_addr[7],

(int)addr->s6_addr[8], (int)addr->s6_addr[9],

(int)addr->s6_addr[10], (int)addr->s6_addr[11],

(int)addr->s6_addr[12], (int)addr->s6_addr[13],

(int)addr->s6_addr[14], (int)addr->s6_addr[15]);

}

以上是 扩展一个IPv6地址,以便我可以将其打印到stdout 的全部内容, 来源链接: utcz.com/qa/417264.html

回到顶部