获取接口的IPV6地址和前缀一共有如下3种方法:
1. 通过ifconfig
2. 通过getifaddrs函数
3. 通过cat /proc/net/if_inet6

第一种和第三种都类似于读文件,下面主要看一下第二种方法的代码示例:

/************************************************************Copyright (C), 2017, Leon, All Rights Reserved.
FileName: get_if_addr.c
Description: 获取接口地址
Author: Leon
Version: 1.0
Date:
Function:History:
<author>    <time>  <version>   <description>
Leon************************************************************/#include <arpa/inet.h>
#include <sys/socket.h>
#include <netdb.h>
#include <ifaddrs.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>int cale_prefix_len(struct in6_addr *mask)
{int i = 0;int len = 0;int u = 0;for(i = 0; i < 16; i++){u = mask->s6_addr[i];if(ffs(u) > 0){len += 9 - ffs(u);}else{break;}}return len;
}int get_if_addr6(char *ifname, struct sockaddr_in6 *list, int len)
{   struct ifaddrs *ifaddr, *ifa;   int cnt = 0;char ip_str[64];if(!ifname || !list || !len)return 0;if (-1 == getifaddrs(&ifaddr)){perror("getifaddrs");return; }for(ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {       if(ifa->ifa_name && !strcmp(ifa->ifa_name, ifname) &&ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_INET6){   if(cnt > len)break;memcpy(&list[cnt], ifa->ifa_addr, sizeof(struct sockaddr_in6));inet_ntop(AF_INET6, &list[cnt].sin6_addr, ip_str, sizeof(ip_str));printf("%s [%d] %s\n", ifname, cnt, ip_str);int i = 0;for(i =0 ; i < 16; i++){printf("%02x ",  (((struct sockaddr_in6*)(ifa->ifa_netmask))->sin6_addr).s6_addr[i] );}printf("\n");printf("mask len: %d\n", cale_prefix_len(&((struct sockaddr_in6*)(ifa->ifa_netmask))->sin6_addr));inet_ntop(AF_INET6, &((struct sockaddr_in6*)(ifa->ifa_netmask))->sin6_addr, ip_str, sizeof(ip_str));printf("%s [%d] %s [netmask]\n", ifname, cnt, ip_str);cnt++;}}   freeifaddrs(ifaddr);      return cnt;
}int main(int argc, char *argv[])
{char buf[256] = {0};struct sockaddr_in6 *list = malloc(16 * sizeof(struct sockaddr_in6));get_if_addr6(argv[1], list, 16);return 0;
}

执行结果如下:

# ./a.out eth2
eth2 [0] 2006::1
ff ff ff ff ff ff fe 00 00 00 00 00 00 00 00 00
mask len: 55
eth2 [0] ffff:ffff:ffff:fe00:: [netmask]
eth2 [1] 2005::1
ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00 00
mask len: 56
eth2 [1] ffff:ffff:ffff:ff00:: [netmask]
eth2 [2] 2003::1
ff ff ff ff ff ff 00 00 00 00 00 00 00 00 00 00
mask len: 48
eth2 [2] ffff:ffff:ffff:: [netmask]
eth2 [3] 2001:5521::1
ff ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00
mask len: 64
eth2 [3] ffff:ffff:ffff:ffff:: [netmask]
eth2 [4] fe80::20c:29ff:fe8f:c17c
ff ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00
mask len: 64
eth2 [4] ffff:ffff:ffff:ffff:: [netmask]

对应的ifconfig输出:

eth2      Link encap:Ethernet  HWaddr 00:0c:29:8f:c1:7c  inet6 addr: 2006::1/55 Scope:Globalinet6 addr: 2001:5521::1/64 Scope:Globalinet6 addr: 2003::1/48 Scope:Globalinet6 addr: fe80::20c:29ff:fe8f:c17c/64 Scope:Linkinet6 addr: 2005::1/56 Scope:GlobalUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:12983 errors:0 dropped:7 overruns:0 frame:0TX packets:117 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:1189601 (1.1 MB)  TX bytes:16596 (16.5 KB)Interrupt:16 Base address:0x2400 

获取接口所有IPV6地址和前缀的方法相关推荐

  1. linux下获取本机IPv6地址、前缀、网关

    原文:linux下获取本机IPv6地址.前缀.网关 获取本机IPv6信息命令:cat /proc/net/if_inet6 root@IT-PC-135:/home/user1/# cat /proc ...

  2. 常识-java获取本机ipv6地址以及关闭临时ipv6地址

    关闭临时ipv6地址 临时ipv6有助于本机安全,然而有时用不到,比如用其进行长久的ftp链接,随时待命是不合适的 右键管理员cmd,输入命令关闭临时ipv6 netsh interface ipv6 ...

  3. 微指令地址的形成方式_交换那些事儿 | 基础维护篇 IPv6地址分类及配置方法

    IPv6地址分类及配置方法 H3C交换机基础维护篇 何为IPv6 随着网络的不断扩大和发展,IPv4的地址空间已不能满足需求,因此IPv6协议的应用越来越广泛.那么IPv6地址是如何规范和配置的呢,今 ...

  4. PHP获取用户访问IP地址的5种方法

    PHP获取用户访问IP地址的5种方法: //方法1: <?php                                                                 ...

  5. 获取局域网远程主机ipv6地址

    复现CVE-2020-16898 TCP/IP远程代码执行漏洞时,需要目标主机ipv6地址,如果靶机不在本地,如何获取局域网远程主机ipv6呢? 扫描局域网同网段IP,获取存活主机(或者使用arp - ...

  6. 新华三H3CMagic系列路由器获取不到IPV6地址解决方法

    适用于H3C Magic NX15000/NX30/NX54/NX18/NX15/BX54/RC3000 H3C Magic系列路由器底层使用的是openwrt的开源路由系统,IPV6功能相关设置也比 ...

  7. 几种获取本机IPv6地址的方法

    如同获取IPv4的地址一般,获取IPv6也是可以通过使用网卡信息来得到IPv6的地址,也可以给一个多播地址发送数据包然后获取IPv6的地址.在IPv4通过iotcl函数是可以获取本主机的IPv4的地址 ...

  8. IPv6地址分类及表示方法

    对于IPv4地址,我们知道分为A类.B类.C类.组播地址和留用地址,几大类,ABC类地址中还会有不同功能的如广播地址.私有地址等类型.那么IPv6的地址是怎么分类的呢?本文就带大家初步了解一下. 先说 ...

  9. linux编程获取本机IP地址的三种方法

    这是一项不太清晰而且没有多大意义的工作.一个原因是网络地址的设置非常灵活而且都是允许用户进行个性化设置的,比如一台计算机上可以有多块物理网卡或者虚拟网卡,一个网卡上可以绑定多个IP地址,用户可以为网卡 ...

最新文章

  1. CentOS6怎么样设置ADSL上网
  2. Uploadify_THINKPHP配置说明
  3. 产品经理——pm具备的五项技能
  4. MQTT——QoS服务质量等级
  5. 【学亮IT手记】ECMAScript的数据类型及类型转换
  6. iframe有那些缺点
  7. 印象笔记编辑pdf_笔记软件使用体验(至2020.03)
  8. win7怎么把计算机放到桌面6,win7系统如何设置更改桌面图标?
  9. python __builtins__ copyright类 (14)
  10. javaScript内置对象简介
  11. 调整自己,必须调整自己了
  12. oracle10g连接自动断开,报ORA-03135错误
  13. 程序猿DD元旦送书:第二弹!
  14. Android 网络图片加载之cude 框架
  15. 支持linux的蓝牙键盘,可连接四款蓝牙设备的机械键盘 功能强大 不容小觑
  16. QKX-ZSZ-4000岩体真三轴动静载荷-应力应变曲线绘制软件
  17. vue3自定义开发酒店房态时间组件
  18. 2.1 Converting Celsius to Fahrenheit
  19. 程序自动修复相关工作总结
  20. Python高并发爬虫测评(2): 多进程, 多线程和异步协程哪个快?

热门文章

  1. allergo 导出光辉配置_请教Allegro导出光绘文件的层要选择哪些层?
  2. wince6.0远程控制工具_用微信远程控制你的电脑,这个工具又加了一些小功能(硬件+软件)...
  3. 自然语言识别python_自然语言处理工具python调用hanlp中文实体识别
  4. linux 7 改网卡名称,CentOS7修改网卡名称
  5. webpack的安装
  6. Tomcat的部署+第一个Servlet
  7. hadoop streaming怎么设置key
  8. BZOJ 3571: [Hnoi2014]画框
  9. android-activity生命周期方法
  10. 找出只出现一次的第一个字符