如何获取当前配置的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地址解读---子网掩码

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

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

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

看一遍就完全搞定的正则表达式教程

[原创文章,转载请保留或注明出处:http://www.regexlab.com/zh/regref.htm] 引言     正则表达式(regular expression)就是用一个“字符串”...

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

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

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

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

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

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

windows下手动配置ipv6地址

在XP,2003等早期版本中,ipv6地址在“网络连接”的属性配置里是无法手工配置的,只能使用netsh配置。配置方法如下: 首先,安装IPV6协议,ipv6 install 第二步,查看...

RFC4291IPv6寻址结构 RFC4862地址自动配置

5、接口标识 对于所有单播地址,除了以二进制值000开始的以外,要求接口标示符为64比特长,由改进的EUI-64格式构建。 当源自全球标记时(例如,IEEE 802 48-bit MAC标识符或IEE...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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