由于一个需求需要获取网卡的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 ;
}

运行结果

最新文章

  1. SharePoint 2013 新手注意事项总结[不断更新ing]
  2. access查询优化
  3. codecademy-command line-inputoutput
  4. 【读书笔记】iOS-防止通讯协议被轻易破解的方法
  5. hadoop 2.0 详细配置教程
  6. [转载]sql server 等待类型
  7. 搭建集群必备:windows如何使用Xshell远程连接(SSH)Linux
  8. java新手笔记4 数组
  9. MVC3 IIS7部署记录
  10. CXF 的IP拦截
  11. python--批量下载豆瓣图片之升级版本
  12. Bzoj4237:稻草人
  13. checkbox属性获取
  14. 原码、补码、反码的概念和java数的存储方式
  15. codefroces 266
  16. String中hashCode方法的线程安全
  17. WinForm 窗体间参数传递
  18. c++之sleep函数
  19. ZOJ 2319 Beautiful People
  20. skimage exposure模块解读

热门文章

  1. node做验证码
  2. 原生javasxript获取浏览器的滚动距离和可视窗口的高度
  3. jQuery带闹钟的数字时钟
  4. poj 3080 Blue Jeans【字符串处理+ 亮点是:字符串函数的使用】
  5. Windows Server 2008 架设 Web 服务器教程(图文详解)
  6. uvalive 6932
  7. tyvj 1402 乌龟棋 dp
  8. linux防火墙开关
  9. php开发工程师面必问题
  10. hzau 1199 Little Red Riding Hood