如何获取当前配置的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:...

IPv6地址前缀

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

Grub4dos典型菜单文件示范解读

Bash语言: Grub4dos典型菜单文件示范解读 001 terminal console 002 color white/blue blue/yellow light-red/blue ...
  • xcntime
  • xcntime
  • 2014年12月22日 22:08
  • 631

运用 Windows 工具获取 IPv6 配置信息

运用 Windows 工具获取 IPv6 配置信息本文介绍如何使用命令行工具,获取运行 Microsoft?Windows?XP Service Pack 2 (SP2)、Windows Server...
  • hansel
  • hansel
  • 2010年01月12日 17:47
  • 1058

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

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

IP&IP地址、ipv4&ipv6、子网掩码、网段计算、网络广播ID计算、默认网关、DNS服务器、DHCP服务器

IP&IP地址、ipv4&ipv6、子网掩码、网段计算、网络广播ID计算、默认网关、DNS服务器、DHCP服务器等知识...

Linux下的IPv6地址、路由以及隧道配置

如今,几乎所有的主流操作系统、嵌入式操作提供系统都提供了对IPv6协议栈的支持,在windows XP下面,使用ipv6 install命令便可以启动IPv6协议栈,在默认安装的linux下,利用...
  • xuleilx
  • xuleilx
  • 2012年04月20日 11:01
  • 9915

IPv6地址自动配置中的有状态(stateful)和无状态(stateless)的区别

一个典型的IPv6主机单播地址由3部分组成:全局路由前缀、子网ID和接口ID(64位)。全局 路由前缀用来识别分配给一个站点的一个地址范围。子网ID也称为子网前缀,一个子网ID与 一个链接相关联,以识...
  • babyfans
  • babyfans
  • 2013年02月18日 23:14
  • 14183

在Win 2008配置DHCP分发IPV6的地址

请教关于DHCP如何分配IPV6地址;希望通过DHCP为客户端计算机分配IPV6地址,请问在2008的DHCP上如何配置,麻烦提供详细的操作步骤。谢谢! 微软技术解答:根据您的描述,我对这个问题...

windows下手动配置ipv6地址

在XP,2003等早期版本中,ipv6地址在“网络连接”的属性配置里是无法手工配置的,只能使用netsh配置。配置方法如下: 首先,安装IPV6协议,ipv6 install 第二步,查看...
  • ssergsw
  • ssergsw
  • 2013年06月19日 09:45
  • 3441
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何获取当前配置的IPV6地址的前缀长度(掩码)
举报原因:
原因补充:

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