1.关于

演示环境:

Linux xxxxxxx 5.4.0-47-generic #51-Ubuntu SMP Fri Sep 4 19:50:52 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

代码来自 StackOverflow But,自己做了部分修改。

2.头文件

#include <sys/types.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>

3.ipv4获取

调用函数get_ip_linux可以获取本机ipv4

int net_adapter_helper::get_ipv4_linux(std::list<std::string>& out_list_ip4)
{
return get_ip_linux(AF_INET, out_list_ip4);
}

4.ipv6获取

调用函数get_ip_linux可以获取本机ipv6

int net_adapter_helper::get_ipv6_linux(std::list<std::string>& out_list_ip6)
{
return get_ip_linux(AF_INET6, out_list_ip6);
}

5.get_ip_linux封装

这里封装,目的是为了更方便维护获取本机IP的代码。通过第一个参数控制当前需要获取ipv4还是ipv6

int net_adapter_helper::get_ip_linux(int ipv4_6, std::list<std::string>& out_list_ip)
{
int ret_val = 0; struct ifaddrs * ifAddrStruct = NULL;
void * tmpAddrPtr = NULL; // 1.
ret_val = getifaddrs(&ifAddrStruct);
if (0 != ret_val)
{
ret_val = errno; return ret_val;
} // 2.
std::string str_ipvX; int padress_buf_len = 0;
char addressBuffer[INET6_ADDRSTRLEN] = {0}; if (AF_INET6 == ipv4_6)
padress_buf_len = INET6_ADDRSTRLEN;
else
padress_buf_len = INET_ADDRSTRLEN; while (NULL != ifAddrStruct )
{
if (ipv4_6 == ifAddrStruct->ifa_addr->sa_family )
{
// is a valid IP4 Address
tmpAddrPtr = &((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr; inet_ntop(ipv4_6, tmpAddrPtr, addressBuffer, padress_buf_len);
str_ipvX = std::string(addressBuffer); out_list_ip.push_back(str_ipvX); memset(addressBuffer, 0, padress_buf_len);
} ifAddrStruct=ifAddrStruct->ifa_next;
} return ret_val;
}

6.测试结果

  • 6.1 调用代码
std::list<std::string> ipv4;
std::list<std::string> ipv6; int ret_val = net_adapter_helper::get().get_ipv4_linux(ipv4);
if (0 != ret_val)
{
cout << "error, ipv4, id = " << ret_val << endl;
}
else
{
int index = 0;
for (auto item: ipv4)
{
cout << "index = " << ++index;
cout << ", ipv4 = " << item.c_str() << endl;
}
} ret_val = net_adapter_helper::get().get_ipv6_linux(ipv6);
if (0 != ret_val)
{
cout << "error, ipv6, id = " << ret_val << endl;
}
else
{
int index = 0;
for (auto item: ipv6)
{
cout << "index = " << ++index;
cout << ", ipv6 = " << item.c_str() << endl;
}
}
  • 6.2 输出结果:

ubuntu(Linux) c++ 获取本机IPv4和ipv6、查询本机IPv4,IPv6的更多相关文章

  1. linux编程获取本机网络相关参数

    getifaddrs()和struct ifaddrs的使用,获取本机IP 博客分类: Linux C编程   ifaddrs结构体定义如下: struct ifaddrs { struct ifad ...

  2. Linux中获取本机的最新IPv6地址_更新ddns的脚本

    Linux中获取本机的最新IPv6地址_更新ddns的脚本 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-11-07. 运营商提供ipv6地址. 路由器后有台linux机器,通过e ...

  3. Linux下获取本机IP地址的代码

    Linux下获取本机IP地址的代码,返回值即为互联网标准点分格式的字符串. #define ETH_NAME "eth0" //获得本机IP地址 char* GetLocalAdd ...

  4. linux下获取软件源码包 centos/redhat, debian/ubuntu

    linux下获取软件源码包 centos/redhat, debian/ubuntu centos下: 1. yum install yum-utils 主要为了获取yumdownloader 2. ...

  5. windows10 c++获取本机IPv4,ipv6,查询本机Ipv4,ipv6

    1.关于 演示环境: win10+VS2017 2.支持 需要下面的库支持: ws2_32.lib 需要下面的宏,添加到项目属性-> c/c++ -> 预处理器定义 _WINSOCK_DE ...

  6. Ubuntu Linux下设置IP的配置命令

    Ubuntu Linux下设置IP的配置命令 今天装了Ubuntu,但是发现不能上网,开始排查问题: 1.首先确定网络连接是否正确,所用的网线是否可以正常工作 2.查看网卡是否能正常工作,检测的方法如 ...

  7. HOWTO install Oracle 11g on Ubuntu Linux 12.04 (Precise Pangolin) 64bits

    安装了Ubuntu 12.04 64bit, 想在上面安装Oracle 11gr2,网上找了好多文档都没成功,最后完全参考了MordicusEtCubitus的文章. 成功安装的关键点:install ...

  8. [r]Ubuntu Linux系统下apt-get命令详解

    Ubuntu Linux系统下apt-get命令详解(via|via) 常用的APT命令参数: apt-cache search package 搜索包 apt-cache show package ...

  9. Linux 下获取LAN中指定IP的网卡的MAC(物理地址)

    // all.h// 2005/06/20,a.m. wenxy #ifndef _ALL_H#define _ALL_H #include <memory.h>#include < ...

随机推荐

  1. O(1)判断两点之间是否有边

    O(1)判断两点之间是否有边 问题描述 给定一张 \(n\) 个点,\(m\) 条边的有向图. 多次询问,要求每次 \(\mathcal{O}(1)\) 判断两点之间是否有边(你可以忽略输入.输出等问 ...

  2. STL的equal_range()

    equal_range()根据键值,返回一对迭代器的pair对象. 如果该键值在容器中存在,则pair对象中的第一个迭代器指向该键关联的第一个实例,第二个迭代器指向该键关联的最后一个实例的下一位置. ...

  3. 【R方差分析】蛋白质表达量多组比较

    初始数据类似: 蛋白质组数据虽不是严格的正态分布,但目前最常用的检验方法还是T检验(两组比较)和方差分析(多组比较).这个话题值得深究,这里不展开. 主要是求多个蛋白的Pvalue值或FDR,用于差异 ...

  4. 05 Windows安装python3.6.4+pycharm环境

    windows安装python3.6.4环境 使用微信扫码关注微信公众号,并回复:"Python工具包",免费获取下载链接! 一.卸载python环境 卸载以下软件: 二.安装py ...

  5. javaSE高级篇4 — 反射机制( 含类加载器 ) — 更新完毕

    反射机制 1.反射机制是什么?----英文单词是:reflect.在java.lang包下---这才是java最牛逼的技术 首先提前知道一句话----在java中,有了对象,于是有了类,那么有了类之后 ...

  6. 一起手写吧!sleep函数!

    Async/Await 版本 function sleep(delay) { return new Promise(reslove => { setTimeout(reslove, delay) ...

  7. 数组相关API,reduce

    reduce() 方法接受一个数组作为输入值并返回一个值.这点挺有趣的.reduce 接受一个回调函数,回调函数参数包括一个累计器(数组每一段的累加值,它会像雪球一样增长),当前值,和索引.reduc ...

  8. 100个Shell脚本——【脚本2】截取字符串

    [脚本2]截取字符串 一.脚本 现有一个字符串如下: http://www.aaa.com/root/123.htm 请根据以下要求截取出字符串中的字符: 1.取出www.aaa.com/root/1 ...

  9. awk的基本用法

    最近遇到导入的csv文件首行为日期,但需要将日期作为列导入到数据库中,直接使用ctl文件好像无法实现,了解到awk这个强大的命令. 导入的CSV文件除了首行为日期,其他的都是格式相同的.需要将首行单独 ...

  10. java内存管理的小技巧

    1,尽量使用直接量.     采用String str="hello"; 而不是 String str = new String("hello"): 2,使用S ...