获取网卡的MAC地址的方法很多,如:Netbios,SNMP,GetAdaptersInfo等。经过测试发现 Netbios 方法在网线拔出的情况下获取不到MAC,而 SNMP 方法有时会获取多个重复的网卡的MAC,试来试去还是 GetAdaptersInfo 方法比较好,网线拔出的情况下可以获取MAC,而且很准确,不会重复获取网卡。

  GetAdaptersInfo 方法也不是十全十美,也存在些问题:

  1)如何区分物理网卡和虚拟网卡;

  2)如何区分无线网卡和有线网卡;

  3)“禁用”的网卡获取不到。

  关于问题1和问题2我的处理办法是:

  区分物理网卡和虚拟网卡:pAdapter->Description中包含"PCI"是:物理网卡。(试了3台机器可以)

  区分无线网卡和有线网卡:pAdapter->Type为71的是:无线网卡。(试了2个无线网卡也可以)

  现在把代码贴出来和大家分享:

  #include "stdafx.h"

  #include <atlbase.h>

  #include <atlconv.h>

  #include "iphlpapi.h"

  #pragma comment ( lib, "Iphlpapi.lib" )

  int main(int argc, char* argv[])

  {

  PIP_ADAPTER_INFO pAdapterInfo;

  PIP_ADAPTER_INFO pAdapter = NULL;

  DWORD dwRetVal = 0;

  pAdapterInfo = (IP_ADAPTER_INFO *) malloc( sizeof(IP_ADAPTER_INFO) );

  ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);

  if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS)

  {

  GlobalFree (pAdapterInfo);

  pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen);

  }

  if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) == NO_ERROR)

  {

  pAdapter = pAdapterInfo;

  while (pAdapter)

  {

  if(

  strstr(pAdapter->Description,"PCI") > 0 // pAdapter->Description中包含"PCI"为:物理网卡

  || pAdapter->Type == 71                   // pAdapter->Type是71为:无线网卡

  )

  {

  printf("------------------------------------------------------------\n");

  printf("Adapter Name: \t%s\n", pAdapter->AdapterName);

  printf("Adapter Desc: \t%s\n", pAdapter->Description);

  printf("Adapter Addr: \t");

  for (UINT i = 0; i < pAdapter->AddressLength; i++)

  {

  printf("%02X%c", pAdapter->Address[i],

  i == pAdapter->AddressLength - 1 ? '\n' : '-');

  }

  printf("Adapter Type: \t%d\n", pAdapter->Type);

  printf("IP Address: \t%s\n", pAdapter->IpAddressList.IpAddress.String);

  printf("IP Mask: \t%s\n", pAdapter->IpAddressList.IpMask.String);

  }

  pAdapter = pAdapter->Next;

  }

  }

  else

  {

  printf("Call to GetAdaptersInfo failed.\n");

  }

  return 0;

  }

VC获取物理网卡的MAC地址的更多相关文章

  1. Java获取网卡的mac地址

    为了项目的安全,有时候需要得到电脑的唯一码,比如:网卡的mac地址.和大家分享一下,下面是项目中用到的工具类: import java.io.BufferedReader;import java.io ...

  2. inux网卡与MAC地址绑定方法总结

        使用linux系统时会出现这样的情况,当你安装了某个网卡的驱动程序时,或者安装了与网卡相关的程序后. 网卡会出现所谓的漂移现象.(注意:不是飘逸).可能的表象为: (1):网卡顺序颠倒,比如之 ...

  3. Java获取主板序列号、MAC地址、CPU序列号工具类

    import java.io.File; import java.io.FileWriter; import java.io.BufferedReader; import java.io.IOExce ...

  4. PHP获取网卡的MAC地址原码;目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址

    声明转换于其它博客当中的. <?php /** 获取网卡的MAC地址原码:目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址 **/ class GetMacAddr{ var $ ...

  5. Linux下修改网卡的mac地址

    方法1: # ifconfig ethX down # ifconfig ethX hw ether NEW_MAC_ADDR # ifconfig ethX up 但是这样重启后就失效了,需要再敲一 ...

  6. 如何获取公网IP的mac地址

    如何获取远程IP的mac地址 思路分析 由于java本身没有相关的jar包进行获取,所以这里介绍从其他的方面进行入手和实践 使用的工具对比: tcpdump tshark pcap4j 都可以达到抓包 ...

  7. JAVA获取本机的MAC地址

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

  8. Linux:永久修改网卡的MAC地址

    比如:搭建一个虚拟机环境之后,需要N个一样的系统,可以本地复制虚拟机来实现.但是复制之后,网卡的MAC地址一样,无法使用,这时候需要修改网卡的MAC地址,且希望重启系统之后,仍生效的,步骤如下: 1. ...

  9. 在Linux下,在网络没有配置好前,怎样查看网卡的MAC地址?

    在Linux下,在网络没有配置好前,怎样查看网卡的MAC地址? 使用 dmesg 与 grep 命令来实际,例如以下: [root@localhost ~]# dmesg | grep eth e10 ...

随机推荐

  1. Android Toolbar的使用 顶部标题栏+后退键

    最近设计安卓里面有个标题栏,里面有个后退键,可以完成后退之类的功能. 好,刚好可以用Toolbar去实现 上代码:activity_main.xml <?xml version="1. ...

  2. git pull出现There is no tracking information for the current branch

    使用git pull 或者 git push 的时候报错 gitThere is no tracking information for the current branch. Please spec ...

  3. sc58x config

    addip=set bootargs ${bootargs} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}:eth0:off ...

  4. CAS (10) —— JBoss EAP 6.4下部署CAS时出现错误exception.message=Error decoding flow execution的解决办法

    CAS (10) -- JBoss EAP 6.4下部署CAS时出现错误exception.message=Error decoding flow execution的解决办法 jboss版本: jb ...

  5. SpringBoot 开启 Actuator

    在生产环境中,需要实时或定期监控服务的可用性.spring-boot 的actuator(监控)功能提供了很多监控所需的接口.简单的配置和使用如下: 1.引入依赖: <dependency> ...

  6. 使用postman测试文件上传

    调试API神奇----postman 请求方法:POST Body-->form-data-->key(选择file) QQ技术交流群:282575808 ---------------- ...

  7. phpStudy启动失败提示:缺少VC9运行库

    镜像是官方2008 64位中文版 按照提示安装了VC9以后 软件依旧无法运行阿帕奇,提示缺少VC9运行库 这是因为:64位系统除了要装64位的运行库也要装32位的运行库 32位的VC9运行库下载:ht ...

  8. HwPointEventFilter: do not support AFT because of no config华为手机进入工程菜单

    在调试时应用报出HwPointEventFilter: do not support AFT because of no config 是因为华为系统里设置了不打印log 解决方法是在拨号界面输入*# ...

  9. GCC编译错误小结

    gcc编译时对’xxxx’未定义的引用问题可能错误 错误一: 没有实现xxxx 错误二: c++引用c语言so库,但是so库头文件没有extern "C" 错误三: 检查各个共享库 ...

  10. Numpy 的数组转置和轴对换

    数组转置 转置(transpose)是重塑的一种特殊形式, 它返回的是源数据的视图(不会进行任何操作.)数组不仅有transpose,还要特殊的T属性 计算矩阵内积 高维数组transpose 详细讲 ...