win32 获取本机网卡信息(MAC地址,IP地址等)
由于一个需求需要获取网卡的MAC地址,就搜了一下,大部分都是COPY来COPY去的一些代码,有很多甚至不能直接运行或有还有内存泄漏。自己查了一下MSDN然后封装了一下;
需要注意,一个机器可能有多个网卡(包含虚拟网卡),一个网卡可能有多个IP
主要用到了 GetAdaptersInfo 这个API,可以自己去MSDN查一下
下面是我的封装,可以直接用,也可以按照你的需求改,我这里只需要获取MAC地址,IP,和描述就够了,通过描述可以筛选掉VMware和VPN生成的虚拟网卡
// 头文件包含
#include "stdafx.h"
#include <WinSock2.h>
#include <Iphlpapi.h>
#include <iostream>
#include <string>
#include <map>
#include <vector> #pragma comment(lib,"iphlpapi.lib") #define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x)) typedef struct _MyAdpterInfo
{
std::vector<std::string> Ip;
std::string MacAddress;
std::string Description;
std::string Name;
UINT Type;
}MyAdpterInfo; int MyGetAdptersInfo(std::vector<MyAdpterInfo>& adpterInfo)
{
PIP_ADAPTER_INFO pAdapterInfo;
PIP_ADAPTER_INFO pAdapter = NULL;
DWORD dwRetVal = ;
UINT i; /* variables used to print DHCP time info */
struct tm newtime;
char buffer[];
errno_t error; ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
pAdapterInfo = (IP_ADAPTER_INFO *)MALLOC(sizeof(IP_ADAPTER_INFO));
if (pAdapterInfo == NULL)
{
printf("Error allocating memory needed to call GetAdaptersinfo\n");
return -;
}
// Make an initial call to GetAdaptersInfo to get
// the necessary size into the ulOutBufLen variable
if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW)
{
FREE(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *)MALLOC(ulOutBufLen);
if (pAdapterInfo == NULL)
{
printf("Error allocating memory needed to call GetAdaptersinfo\n");
return -; // error data return
}
} if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR)
{
pAdapter = pAdapterInfo;
while (pAdapter)
{
MyAdpterInfo info;
info.Name = std::string(pAdapter->AdapterName);
info.Description = std::string(pAdapter->Description);
info.Type = pAdapter->Type;
char buffer[];
sprintf_s(buffer, "%.2x-%.2x-%.2x-%.2x-%.2x-%.2x", pAdapter->Address[],
pAdapter->Address[], pAdapter->Address[], pAdapter->Address[],
pAdapter->Address[], pAdapter->Address[]);
info.MacAddress = std::string(buffer);
IP_ADDR_STRING *pIpAddrString = &(pAdapter->IpAddressList);
do
{
info.Ip.push_back(std::string(pIpAddrString->IpAddress.String));
pIpAddrString = pIpAddrString->Next;
} while (pIpAddrString);
pAdapter = pAdapter->Next;
adpterInfo.push_back(info);
}
if (pAdapterInfo)
FREE(pAdapterInfo);
return ; // normal return
}
else
{
if (pAdapterInfo)
FREE(pAdapterInfo);
printf("GetAdaptersInfo failed with error: %d\n", dwRetVal);
return ; // null data return
}
} int _tmain(int argc, _TCHAR* argv[])
{
std::vector<MyAdpterInfo> AdptersInfo;
int ret = MyGetAdptersInfo(AdptersInfo);
for (int i = ; i < AdptersInfo.size(); ++i)
{
std::cout << "Adpter name: " << AdptersInfo[i].Name << std::endl;
std::cout << "Adpter description: " << AdptersInfo[i].Description << std::endl;
std::cout << "Adpter MAC: " << AdptersInfo[i].MacAddress << std::endl;
std::cout << "Adpter IP: ";
for (int j = ; j < AdptersInfo[i].Ip.size(); ++j)
{
if (j != )
{
std::cout << ", ";
}
std::cout << AdptersInfo[i].Ip[j];
}
std::cout << std::endl << std::endl << std::endl;
}
return ;
}
运行结果

win32 获取本机网卡信息(MAC地址,IP地址等)的更多相关文章
- C++获取本机用于连接的IP地址
最近写个程序需要获取本机用于连接的IP地址,经过很多的尝试后,最终使用的方法如下: 使用cmd命令 netstat | findstr “192.168.6.66:3333” > D:\ ...
- JAVA获取本机的MAC地址
/** * 获取本机的Mac地址 * @return */ public String getMac() { InetAddress ia; byte[] mac = null; try { // 获 ...
- Delphi获取本机的MAC地址
Delphi获取本机的MAC地址: uses NB30; function GetAdaPterInfo(lana: Char): string; var Adapter: TAdapterS ...
- JAVA获取客户端请求的当前网络ip地址(附:Nginx反向代理后获取客户端请求的真实IP)
1. JAVA获取客户端请求的当前网络ip地址: /** * 获取客户端请求的当前网络ip * @param request * @return */ public static String get ...
- 【liunx】使用xshell连接虚拟机上的CentOS 7,使用xhell连接本地虚拟机上的Ubuntu, 获取本地虚拟机中CentOS 7的IP地址,获取本地虚拟机中Ubuntu 的IP地址,Ubuntu开启22端口
注意,如果想用xshell去连接本地虚拟机中的linux系统,需要本地虚拟机中的系统是启动的才能连接!!!!! ============================================ ...
- Java 获取当前项目所在服务器的 IP 地址
java中获取当前服务器地址主要使用到InetAddress这个类 public static void main(String[] args) { try { //用 getLocalHost() ...
- javascript获取当前用户访问的宽带IP地址
javascript获取当前用户访问的宽带IP地址 <script src="http://pv.sohu.com/cityjson?ie=utf-8"></sc ...
- 彻底明白IP地址——IP地址的介绍
彻底明白IP地址——IP地址的介绍 [ 作者:担子 转贴自:赛迪网 点击数:9692 更新时间:2004-12-22 ] IP地址的介绍 1.IP地址的表示方法 IP地址 = ...
- 获取本机正在使用的ipv4地址(访问互联网的IP)
[转]原文地址:http://www.cnblogs.com/lijianda/p/6604651.html 1.一个电脑有多个网卡,有线的.无线的.还有vmare虚拟的两个网卡.2.就算只有一个网卡 ...
随机推荐
- 1.python基本数据类型
1.数值类型(4种) 数值类型都是不可变的 1)整型(int) example: a = 0 b = -1 诸如此类,都为整型 2)浮点型(float) example: f = 1.1 f = -1 ...
- groupby和agg的使用
先来看一段代码: 分析下groupby和agg的联合使用: reset_index()表示重新设置索引 agg传进来的统计特征: 按照A这一列作聚合,C这一列作统计 注意:df = df.groupb ...
- CentOS 7 导入epel库
yum install epel-release 或者到百度云下载相应的 rpm 包进行安装 rpm -ivh epel-release-7-9.noarch.rpm
- Luogu-3878 [TJOI2010]分金币
这题和在我长郡考试时的一道题思路差不多...考虑折半搜索,预处理左半边选的方案所产生的数量差值\(x\)以及价值差值\(y\),把\(y\)扔到下标为\(x\)的set里面,然后在搜索右半边,每搜出一 ...
- 设置浏览器地址栏URL前面显示的图标
其实很简单,你只做个ico图标,命名为favicon.ico,把它传到你的页面下面. 并在相应的页面里加上代码 在页面<heah></heah>之间加, <link r ...
- 计时器(C#)
很多项目要用到计时器,我就自己包装了一个,倒计时还没加,有时间再加上吧.持续更新 using UnityEngine; using UnityEngine.UI; /// <summary> ...
- Python — 多线程与多进程
1.多线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位,一个进程可以包含多个线程.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线 ...
- OSX 10.11 El Caption USB安装盘制作方法
OSX 10.11 El Caption USB安装盘制作方法 官方在线下载地址:https://developer.apple.com/osx/download/ 1. 用磁盘工具将USB盘抹掉或者 ...
- linux下安装Java se和Eclipse
首先要去下载好JDK,Java SE 8的官方网址是http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-213 ...
- ionic2——安装Java jdk并配置环境变量
前言:jdk是 Java 语言的软件开发工具包,它包含了Java 的运行环境,Java 工具和Java 基础的类库.做java web开发,android开发,还有现在流行的混合式App开发,都需要安 ...