如何获取当前配置的IPV6地址的前缀长度(掩码)

原创 2013年12月02日 20:48:05

首先问个问题: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>


       int
       main(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 we
              can 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 symbolic
                  form 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子网掩码划分

IPv6中没有子网掩码的概念,也没有网络号与主机号的概念。取而代之的是“前缀长度”和“接口ID”。前缀长度就可以当作子网掩码来理解。接口ID可以当作主机号来理解。比如地址2001:1234:2234:...
  • petershina
  • petershina
  • 2012年11月08日 11:44
  • 11746

ipv6地址解读---子网掩码

首先看ipv4的地址: ipv4地址一共32位,用点分十进制表示,每一个部分是8位。子网掩码有两种表示: 第一种: ip: 192.168.1.3 mask:255.255.255.0...
  • zhylei
  • zhylei
  • 2012年07月29日 11:39
  • 22659

获取接口所有IPV6地址和前缀的方法

获取接口的IPV6地址和前缀一共有如下3种方法: 1. 通过ifconfig 2. 通过getifaddr函数 3. 通过cat /proc/net/if_inet6第一种和第三种都类似于读文件...
  • u013401853
  • u013401853
  • 2017年04月05日 17:37
  • 2017

由子网掩码字符串转换成长度前缀的代码示例

最近在进行的ONVIF任务,有一个接口是设置IP的,叫SetNetworkInterfaces,可以设置包括网络速率、双工、自动协商等功能,还可以改IP。但里面有子网掩码字段,只有一个叫PrefixL...
  • subfate
  • subfate
  • 2016年01月24日 18:54
  • 1806

IPv6地址前缀

当我们通过ipv6 install 命令在windows XP系统上安装了ipv6协议栈后,我们可以看到原来的网卡多了一个新的地址-ipv6地址。 这个地址是基于ipv6无状态自动配置机制设定的。 ...
  • tjhon
  • tjhon
  • 2013年09月28日 10:36
  • 5543

JAVA代码根据IP/掩码位数格式地址段得到起始地址和结束地址,可用IP数量,掩码

网上根据IP/掩码位数获取起始地址的方法大多是JS代码实现.项目需要在后台进行处理.提供一份根据IP/掩码获取起始地址通过java代码实现 //IP String ip = "192.168.3...
  • Cug_wangww
  • Cug_wangww
  • 2017年12月11日 14:21
  • 233

ipv6的表示、ipv6与ipv4之间的转换、ipv6地址大小判定

本文对初步接触到ipv6时,常遇到的三个疑问(ipv6的表示、ipv6与ipv4之间的转换、ipv6地址大小判定)进行了简单介绍。...
  • chenjhit
  • chenjhit
  • 2017年04月18日 09:26
  • 3813

关于getifaddrs()和struct ifaddrs的说明

1,关于struct ifaddrs的说明:  struct ifaddrs  {      struct ifaddrs  *ifa_next;    /* Next item in li...
  • liubeck
  • liubeck
  • 2013年01月10日 11:29
  • 943

【IPV6】IP地址分配原则

IPv6最显著的特征就在于它的巨量的地址空间,我们知道IPv6采用128位的地址长度,是IPv4的四倍。 在IPv4时最多就可有2^32或4,294,967,296(40多亿)个可能的IP地址,但由...
  • js_xj
  • js_xj
  • 2014年12月03日 17:25
  • 8349

如何获取当前配置的IPV6地址的前缀长度(掩码)

首先问个问题:IPV6是否有掩码? 答: 有   GOOGLE上查了一圈没有找到好的方法,字节摸索了一套可行的方法,同分享: 下述程序打印处掩码长度,由此判断前缀长度,good!   ...
  • qugang1982
  • qugang1982
  • 2013年12月02日 20:48
  • 3166
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何获取当前配置的IPV6地址的前缀长度(掩码)
举报原因:
原因补充:

(最多只允许输入30个字)