windows10 c++获取本机IPv4,ipv6,查询本机Ipv4,ipv6
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的更多相关文章
- 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 ...
- ipv4理论知识1-ipv4介绍,ipv4记法,地址段个数算法
定义 在TCP/IP协议中,用于在IP层识别连接到因特网设备的标识符称为因特网地址或IP地址.IPv4地址是一个32位的地址. 地址空间 像IPv4这种定义了地址的协议都有一个地址空间.地址空间就是协 ...
- 将物理机转换成vmware虚机
随着虚拟化的快速发展,公司主要是以公有云+私有云结合的混合云部署,据我不成熟的了解,目前很少有公司会将一台单独的物理机作为服务器,在公司内部大家逐渐接受了私有云的部署方案,这样做不但可以节省硬件资源, ...
- Sublime WiFi真机同步和WiFi真机预览使用说明
概述WiFi真机同步: 通过在Sublime中建立调试服务,接收真机设备主动连接调试的方式,配合apploader及自定义loader,为开发者提供在局域网内通过WiFi实现应用快速真机同步和实时预览 ...
- 介绍一种android的裸刷机方法(fastboot刷机实质)
fastboot刷机的前提是你的开发板uboot良好并能正常启动进入fastboot模式,你的开发版的nand分区已存在.对于Android的uboot而言, 已经实现了fastboot命令,当你 ...
- EXSI宿主机更换硬盘后虚机启动有问题
环境说明: 最近EXSI主机磁盘坏掉了,重新换掉磁盘以后启动虚机有问题. 虚机的报错信息如下: 找了下修复方法,操作过程为: 尝试修复 (以下是百度的方法) ls -l /dev/mapper mkd ...
- 本地Mac通过堡垒机代理实现跨堡垒机scp问题
近日,公司在跳板机前架设了堡垒机,以防止ssh攻击,但这带来一个问题,我们平常直接ssh跳板机,可以直接使用scp来上传或下载跳板机数据到本地 架设堡垒之后经常使用的scp工具不好用了 于是本期就来解 ...
- Windows10 c++获取网卡信息(ipv4,子网掩码,网关,mac地址)
关于 本文样式环境: win10 + vs2017 + c++11 1.说明 算是踩坑吧,先前一直认为一块网卡只能有一个IP. 今天发现结构体中,定义了相关结构: 一块网卡可以用多个IP. 2.连接库 ...
- 在Linux上查询物理机信息-不用去拆机器了
目录 一.查看系统信息(包含机器型号) 1.1 查看机型和品牌 二.查看CPU 信息 2.1 查看CPU 型号 2.2 查看CPU的物理数量 2.3 查看 CPU核心数量(非逻辑CPU) 2.4 查看 ...
随机推荐
- Discontinuous Galerkin method for steady transport problem
下面讨论如何使用 Discontinuous Galerkin 求解恒定对流问题. 1.简介 恒定状态对流方程 \[\begin{equation} a\cdot \nabla \mathbf{u} ...
- Linux中gz文件操作遇到的一些技巧和坑
目录 不解压情况下获取gz超大文件的前/后几行? Perl读入gz文件操作? 不能直接通过wc -l 来统计gz文件的行数 前提是gz文件超大,如上百G,肯定不能直接解压来做. 不解压情况下获取gz超 ...
- ping 的原理
ping 的原理ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接.ping 使用的是ICMP协议,它发送icmp回送请求消息给目的主机.ICMP ...
- EXCEL如何用公式提取一列中的唯一值和不重复值
说明:思路用的很新奇,也对COUNTIF有了更深一步的了解,但是,对于百行数据运算速度特别低,不适合数据多的使用 当面对一堆数据,我们要提取一列的唯一值的时候,如果单纯用人为一个个判断,显然是不科学的 ...
- Spark3学习入门【基于Java】
Spark 是离线数据处理的一种大数据技术,和Flick相比数据处理要延后,因为Flick是实时数据处理,而Spark需要先读取数据到内存. Spark的库是基于Scala写的,虽然Scala也是运行 ...
- 振鹏同学正式学习java的第一天!
一.今日收获 1.最棒的莫过于运行Java的HelloWorld! 2.在同学的帮助下历经坎坷困苦安装完成了Eclipse软件并设置好环境变量. 3.最最最开始了解了Java的前世今生,编程语言发展的 ...
- adjust, administer
adjust to just, exact. In measurement technology and metrology [度量衡学], calibration [校准] is the compa ...
- Apache2配置文件解读
每次碰到都不知道具体的作用,所以来分析一下 配置文件结构 apache2在启动的时候自动读取/etc/apache2/apache2.conf文件的配置信息,不同的配置项按功能分布在不同的文件中,然后 ...
- Linux学习 - 数值运算
1 declare 声明变量类型 declare [+/-] [选项] 变量名 - 给变量设定类型属性 + 取消变量的类型属性 -i 将变量声明为整数型 -x 将变量声明为环境变量(同export) ...
- Java Web 实现Mysql 数据库备份与还原
前段时间某某删库事故付出的惨重代价告诉我们: 数据备份的必要性是企业数据管理极其重要的一项工作. 1. Mysql备份与还原命令 备份命令: mysqldump -h127.0.0.1 -uroot ...