由于一个需求需要获取网卡的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地址等)的更多相关文章

  1. C++获取本机用于连接的IP地址

    最近写个程序需要获取本机用于连接的IP地址,经过很多的尝试后,最终使用的方法如下: 使用cmd命令    netstat  | findstr “192.168.6.66:3333” > D:\ ...

  2. JAVA获取本机的MAC地址

    /** * 获取本机的Mac地址 * @return */ public String getMac() { InetAddress ia; byte[] mac = null; try { // 获 ...

  3. Delphi获取本机的MAC地址

    Delphi获取本机的MAC地址: uses   NB30; function GetAdaPterInfo(lana: Char): string; var   Adapter: TAdapterS ...

  4. JAVA获取客户端请求的当前网络ip地址(附:Nginx反向代理后获取客户端请求的真实IP)

    1. JAVA获取客户端请求的当前网络ip地址: /** * 获取客户端请求的当前网络ip * @param request * @return */ public static String get ...

  5. 【liunx】使用xshell连接虚拟机上的CentOS 7,使用xhell连接本地虚拟机上的Ubuntu, 获取本地虚拟机中CentOS 7的IP地址,获取本地虚拟机中Ubuntu 的IP地址,Ubuntu开启22端口

    注意,如果想用xshell去连接本地虚拟机中的linux系统,需要本地虚拟机中的系统是启动的才能连接!!!!! ============================================ ...

  6. Java 获取当前项目所在服务器的 IP 地址

    java中获取当前服务器地址主要使用到InetAddress这个类 public static void main(String[] args) { try { //用 getLocalHost() ...

  7. javascript获取当前用户访问的宽带IP地址

    javascript获取当前用户访问的宽带IP地址 <script src="http://pv.sohu.com/cityjson?ie=utf-8"></sc ...

  8. 彻底明白IP地址——IP地址的介绍

    彻底明白IP地址——IP地址的介绍 [ 作者:担子    转贴自:赛迪网    点击数:9692    更新时间:2004-12-22  ]   IP地址的介绍 1.IP地址的表示方法 IP地址 = ...

  9. 获取本机正在使用的ipv4地址(访问互联网的IP)

    [转]原文地址:http://www.cnblogs.com/lijianda/p/6604651.html 1.一个电脑有多个网卡,有线的.无线的.还有vmare虚拟的两个网卡.2.就算只有一个网卡 ...

随机推荐

  1. mongodb php 支持

    http://bbs.csdn.net/topics/391931404?page=1 windows下为php7.0.4安装目前官方版本对应的最新的php_mongodb.dll扩展,该扩展版本为1 ...

  2. linux基础三---网络基础&软件包管理

    一 ifconfig:显示所有正在启动的网卡的详细信息或设定系统中网卡的IP地址. ifconfig eno16777736 down/up   关闭/开启 eno16777736 网卡 ifconf ...

  3. SOA 面向服务架构 阅读笔记(六)

    20 SOA质量 服务质量是成功的关键因素 20.1 了解SOA带来的无法预料的挑战 不同部门开发 每个开发的组件整合在一起,形成复合应用程序 整合业务流程,考虑质量问题 衡量SOA的质量. 事物质量 ...

  4. Swift中的? ! as as? as!

    ?: 代表这是个可选类型(optional)的.如下,如果num有就为Int类型的,如果没有值那么就是nil. let num:Int? 当我对number进行显示赋值时那么number就是Int类型 ...

  5. Java Map增删改查

    示例代码: 学生类 package com.imooc.collection; import java.util.HashSet; import java.util.Set; /** * 学生类 * ...

  6. css 相对绝对定位

    用Div+CSS进行网站布局时,做一些浮动层等特殊特殊效果时要考虑到定位问题.这就要用到Position属性等.Position属性有四个值:static.fixed.absolute和relativ ...

  7. SpringMVC中响应json数据(异步传送)

    1.首先导入3个jar包: jackson-annotations-2.1.5.jar jackson-core-2.1.5.jar jackson-databind-2.1.5.jar JSON所需 ...

  8. 使用Navicat进行数据库自动备份

    今天经历一次数据库丢库事件,顿时觉得定时备份数据库很重要. 但是每天自己手动备份实在是太麻烦了,于是乎,想到用计划任务进行每天定时自动备份. 发现Navicat自带就有备份  还可以直接计划任务,贼方 ...

  9. Neutron新进展|DragonFlow在Mitaka版本中的Roadmap

    OpenStack网络在Mitaka版本中将有哪些新变化?1月11日到12日,DragonFlow的PTL——Eran Gampel,Kuryr的PTL——Gal Sagie,和他们的老大从以色列来到 ...

  10. keystone DB in devstack

    ~$ mysql -u -p root mysql> use keystone; mysql> show tables;+------------------------+| Tables ...