如何获取当前配置的IPV6地址的前缀长度(掩码)
生活随笔
收集整理的這篇文章主要介紹了
如何获取当前配置的IPV6地址的前缀长度(掩码)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先問個問題:IPV6是否有掩碼?
答: 有
?
GOOGLE上查了一圈沒有找到好的方法,字節摸索了一套可行的方法,同分享:
下述程序打印處掩碼長度,由此判斷前綴長度,good!
?
#include <sys/socket.h>#include <netdb.h>#include <ifaddrs.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <net/if.h>#include <netinet/in.h>#include <sys/types.h>intmain(int argc, char *argv[]){struct ifaddrs *ifaddr, *ifa;int family, s;char host[NI_MAXHOST];char host_netmask[NI_MAXHOST];struct sockaddr_in6 *pip6 = NULL;int i;if (getifaddrs(&ifaddr) == -1) {perror("getifaddrs");exit(EXIT_FAILURE);}/* Walk through linked list, maintaining head pointer so wecan free list later */for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {if (ifa->ifa_addr == NULL)continue;family = ifa->ifa_addr->sa_family;/* Display interface name and family (including symbolicform of the latter for the common families) */printf("%s address family: %d%s\n",ifa->ifa_name, family,(family == AF_PACKET) ? " (AF_PACKET)" :(family == AF_INET) ? " (AF_INET)" :(family == AF_INET6) ? " (AF_INET6)" : "");/* For an AF_INET* interface address, display the address */if (family == AF_INET || family == AF_INET6) {s = getnameinfo(ifa->ifa_addr,(family == AF_INET) ? sizeof(struct sockaddr_in) :sizeof(struct sockaddr_in6),host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);if (s != 0) {printf("getnameinfo() failed: %s\n", gai_strerror(s));exit(EXIT_FAILURE);}getnameinfo(ifa->ifa_netmask,(family == AF_INET)? sizeof(struct sockaddr_in): sizeof(struct sockaddr_in6),host_netmask, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);if(AF_INET6==family){pip6 = (struct sockaddr_in6 *)(ifa->ifa_netmask);char *p = (char *)&(pip6->sin6_addr);for(i=0;i<16;i++){printf("%d ",*p);p++;}}printf("\taddress: <%s>\n", host);printf("\tnetmaks: <%s>\n", host_netmask);}}freeifaddrs(ifaddr);exit(EXIT_SUCCESS);}
?
總結
以上是生活随笔為你收集整理的如何获取当前配置的IPV6地址的前缀长度(掩码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android播放器删除视频教程,列表条
- 下一篇: 找不到驱动程序类,加载驱动失败,连接数据