微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

展开一个IPv6地址,以便我可以打印到标准输出

我使用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: %sn",buf); } } freeifaddrs(myaddrs);

代码非常感谢。

编辑:

由于这显然是很难理解,我会给你一个例子:

从multithreading应用程序使用ptrace

如何编写C ++audio处理应用程序?

googletest:如何设置?

使用Windows自动化查找和调用没有祖先的button

寻找一个更好的过程来删除远程计算机上的文件

如果我得到abcd:12 :: 3我需要展开它为abcd:0012:0000:0000:0000:0000:0000:0003

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

关于标准信号的传送

数百个空闲线程的影响

mmap是一个内置函数吗?

我如何与shm_open共享现有的内存?

如何确定Windows标识是否对应于本地或域用户

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]); }

#include<stdio.h> #include <netinet/in.h> #include <arpa/inet.h> struct in6_addrr { unsigned char addr[16]; }; void ipv6_expander(const struct in6_addr * addr) { char str[40]; sprintf(str,(int)addr->s6_addr[15]); printf("nExpanded ipv6 Addr %sn",str); } int main(int argc,char *argv[]) { struct in6_addrr ipv6; printf("nGiven IPv6 Addr %sn",argv[1]); if(inet_pton(AF_INET6,argv[1],&ipv6.addr)) { ipv6_expander(&ipv6.addr); } else { printf("n errorn"); } return; }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐