1.关于

演示环境: win10+VS2017

2.支持

需要下面的库支持:

ws2_32.lib

需要下面的,添加到项目属性-> c/c++ -> 预处理器定义

_WINSOCK_DEPRECATED_NO_WARNINGS

3.ipv4查询

int net_adapter_helper::get_ipv4_win(std::list<std::string>& out_list_ip4)
{
int error_id = 0;
WORD sock_ver;
WSADATA wsaData;
int ret_val = 0;
sock_ver = MAKEWORD(2, 2);
ret_val = WSAStartup(sock_ver, &wsaData);
if (0 != ret_val)
{
error_id = GetLastError();
return error_id;
} if ( 2 != LOBYTE(wsaData.wVersion) ||
2 !=HIBYTE(wsaData.wVersion) )
{
WSACleanup();
error_id = GetLastError();
return error_id;
} // ------------------------------------------------------------------------------- const int len_256 = 256;
char name_host[len_256] = { 0 }; gethostname(name_host, sizeof(name_host)); PHOSTENT hostinfo;
// 1.
if (NULL == (hostinfo = gethostbyname(name_host)))
{
error_id = GetLastError();
return error_id;
} std::string str_ip4;
char tmp_name_arr[16] = { 0 };
while (NULL != *(hostinfo->h_addr_list) )
{
inet_ntop(AF_INET, (struct in_addr *) *hostinfo->h_addr_list, tmp_name_arr, 16);
str_ip4 = std::string(tmp_name_arr);
out_list_ip4.push_back(str_ip4); hostinfo->h_addr_list++; memset(tmp_name_arr, 0, 16);
} WSACleanup(); return error_id;
}

4.ipv6查询

int net_adapter_helper::get_ipv6_win(std::list<std::string>& out_list_ip6)
{ int error_id = 0;
WORD sock_ver;
WSADATA wsaData;
int ret_val = 0;
sock_ver = MAKEWORD(2, 2);
ret_val = WSAStartup(sock_ver, &wsaData);
if (0 != ret_val)
{
error_id = GetLastError();
return error_id;
} if (2 != LOBYTE(wsaData.wVersion) ||
2 != HIBYTE(wsaData.wVersion))
{
WSACleanup();
error_id = GetLastError();
return error_id;
} // ------------------------------------------------------------------------------- struct addrinfo hint; hint.ai_family = AF_INET6;
hint.ai_socktype = SOCK_STREAM;
hint.ai_flags = AI_PASSIVE;
hint.ai_protocol = 0;
hint.ai_addrlen = 0;
hint.ai_canonname = NULL;
hint.ai_addr = NULL;
hint.ai_next = NULL; const int len_256 = 256;
char name_host[len_256] = { 0 }; struct addrinfo *pailist = nullptr;
struct addrinfo *paip = nullptr;
const char port_str[] = { "10086" }; ret_val = getaddrinfo(name_host, port_str, &hint, &pailist); // 1.
if (0 > ret_val || 0 > pailist)
{
ret_val = GetLastError(); WSACleanup();
return ret_val;
} // 2.
struct sockaddr_in6 *psinp6 = nullptr;
for (paip = pailist; NULL != paip; paip = paip->ai_next)
{
paip->ai_family = AF_INET6;
psinp6 = (struct sockaddr_in6 *)paip->ai_addr;
if (nullptr != psinp6 && NULL != psinp6)
{
std::string str_ipv6;
for (int i = 0; i < 16; i++)
{
if (((i - 1) % 2) && (i > 0))
str_ipv6 += std::string(":"); str_ipv6 += str_format("%02X", psinp6->sin6_addr.u.Byte[i]);
} out_list_ip6.push_back(str_ipv6);
}
} WSACleanup(); return ret_val;
}

5.调用

std::list <std::string> ip4_list;
std::list <std::string> ip6_list; int ret_val = net_adapter_helper::get_instance().get_ipv4_win(ip4_list);
if (0 != ret_val)
{
cout << "\n\nipv4 error = " << ret_val << endl;
}
else
{
int index = 0;
for (auto item : ip4_list)
{
cout << "第" << ++index << "个ip4 = " << item.c_str() << endl;
}
} cout << "\n\n"; ret_val = net_adapter_helper::get_instance().get_ipv6_win(ip6_list);
if (0 != ret_val)
{
cout << "\n\nipv6 error = " << ret_val << endl;
}
else
{
int index = 0;
for (auto item : ip6_list)
{
cout << "第" << ++index << "个ip6 = " << item.c_str() << endl;
}
}

6.结果

windows10 c++获取本机IPv4,ipv6,查询本机Ipv4,ipv6的更多相关文章

  1. ubuntu(Linux) c++ 获取本机IPv4和ipv6、查询本机IPv4,IPv6

    1.关于 演示环境: Linux xxxxxxx 5.4.0-47-generic #51-Ubuntu SMP Fri Sep 4 19:50:52 UTC 2020 x86_64 x86_64 x ...

  2. ipv4理论知识1-ipv4介绍,ipv4记法,地址段个数算法

    定义 在TCP/IP协议中,用于在IP层识别连接到因特网设备的标识符称为因特网地址或IP地址.IPv4地址是一个32位的地址. 地址空间 像IPv4这种定义了地址的协议都有一个地址空间.地址空间就是协 ...

  3. 将物理机转换成vmware虚机

    随着虚拟化的快速发展,公司主要是以公有云+私有云结合的混合云部署,据我不成熟的了解,目前很少有公司会将一台单独的物理机作为服务器,在公司内部大家逐渐接受了私有云的部署方案,这样做不但可以节省硬件资源, ...

  4. Sublime WiFi真机同步和WiFi真机预览使用说明

    概述WiFi真机同步: 通过在Sublime中建立调试服务,接收真机设备主动连接调试的方式,配合apploader及自定义loader,为开发者提供在局域网内通过WiFi实现应用快速真机同步和实时预览 ...

  5. 介绍一种android的裸刷机方法(fastboot刷机实质)

      fastboot刷机的前提是你的开发板uboot良好并能正常启动进入fastboot模式,你的开发版的nand分区已存在.对于Android的uboot而言, 已经实现了fastboot命令,当你 ...

  6. EXSI宿主机更换硬盘后虚机启动有问题

    环境说明: 最近EXSI主机磁盘坏掉了,重新换掉磁盘以后启动虚机有问题. 虚机的报错信息如下: 找了下修复方法,操作过程为: 尝试修复 (以下是百度的方法) ls -l /dev/mapper mkd ...

  7. 本地Mac通过堡垒机代理实现跨堡垒机scp问题

    近日,公司在跳板机前架设了堡垒机,以防止ssh攻击,但这带来一个问题,我们平常直接ssh跳板机,可以直接使用scp来上传或下载跳板机数据到本地 架设堡垒之后经常使用的scp工具不好用了 于是本期就来解 ...

  8. Windows10 c++获取网卡信息(ipv4,子网掩码,网关,mac地址)

    关于 本文样式环境: win10 + vs2017 + c++11 1.说明 算是踩坑吧,先前一直认为一块网卡只能有一个IP. 今天发现结构体中,定义了相关结构: 一块网卡可以用多个IP. 2.连接库 ...

  9. 在Linux上查询物理机信息-不用去拆机器了

    目录 一.查看系统信息(包含机器型号) 1.1 查看机型和品牌 二.查看CPU 信息 2.1 查看CPU 型号 2.2 查看CPU的物理数量 2.3 查看 CPU核心数量(非逻辑CPU) 2.4 查看 ...

随机推荐

  1. Discontinuous Galerkin method for steady transport problem

    下面讨论如何使用 Discontinuous Galerkin 求解恒定对流问题. 1.简介 恒定状态对流方程 \[\begin{equation} a\cdot \nabla \mathbf{u} ...

  2. Linux中gz文件操作遇到的一些技巧和坑

    目录 不解压情况下获取gz超大文件的前/后几行? Perl读入gz文件操作? 不能直接通过wc -l 来统计gz文件的行数 前提是gz文件超大,如上百G,肯定不能直接解压来做. 不解压情况下获取gz超 ...

  3. ping 的原理

    ping 的原理ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接.ping 使用的是ICMP协议,它发送icmp回送请求消息给目的主机.ICMP ...

  4. EXCEL如何用公式提取一列中的唯一值和不重复值

    说明:思路用的很新奇,也对COUNTIF有了更深一步的了解,但是,对于百行数据运算速度特别低,不适合数据多的使用 当面对一堆数据,我们要提取一列的唯一值的时候,如果单纯用人为一个个判断,显然是不科学的 ...

  5. Spark3学习入门【基于Java】

    Spark 是离线数据处理的一种大数据技术,和Flick相比数据处理要延后,因为Flick是实时数据处理,而Spark需要先读取数据到内存. Spark的库是基于Scala写的,虽然Scala也是运行 ...

  6. 振鹏同学正式学习java的第一天!

    一.今日收获 1.最棒的莫过于运行Java的HelloWorld! 2.在同学的帮助下历经坎坷困苦安装完成了Eclipse软件并设置好环境变量. 3.最最最开始了解了Java的前世今生,编程语言发展的 ...

  7. adjust, administer

    adjust to just, exact. In measurement technology and metrology [度量衡学], calibration [校准] is the compa ...

  8. Apache2配置文件解读

    每次碰到都不知道具体的作用,所以来分析一下 配置文件结构 apache2在启动的时候自动读取/etc/apache2/apache2.conf文件的配置信息,不同的配置项按功能分布在不同的文件中,然后 ...

  9. Linux学习 - 数值运算

    1 declare 声明变量类型 declare [+/-] [选项] 变量名 - 给变量设定类型属性 + 取消变量的类型属性 -i 将变量声明为整数型 -x 将变量声明为环境变量(同export) ...

  10. Java Web 实现Mysql 数据库备份与还原

    前段时间某某删库事故付出的惨重代价告诉我们: 数据备份的必要性是企业数据管理极其重要的一项工作. 1. Mysql备份与还原命令 备份命令: mysqldump -h127.0.0.1 -uroot ...