博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VC获取物理网卡的MAC地址
阅读量:6713 次
发布时间:2019-06-25

本文共 1970 字,大约阅读时间需要 6 分钟。

获取网卡的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;

  }

转载于:https://www.cnblogs.com/lxshanye/p/3721912.html

你可能感兴趣的文章
linux之cp/scp命令+scp命令详解
查看>>
Spark 源码分析 -- BlockStore
查看>>
《C语言编程初学者指南》一1.7 创建并运行第一个C程序
查看>>
学习和使用 PHP 应该注意的10件事
查看>>
《Ember.js实战》——2.5 Ember.js对象模型
查看>>
《响应式Web图形设计》一第13章 响应Web设计中的图像
查看>>
shiro session 监听
查看>>
定时任务框架Quartz的新玩法
查看>>
段前缀的使用(0504)
查看>>
.NET Framework 源码
查看>>
开源大数据周刊-第6期
查看>>
centos上一键安装jdk、tomcat脚本
查看>>
排序算法 时间、空间复杂度
查看>>
心痛的感觉
查看>>
class - function ES6类的方法的两种定义方式及调用方式
查看>>
flex容器主轴上的部分元素单独设置位置
查看>>
window10安装Ubuntu虚拟机踩坑系列
查看>>
JavaScript倒计时
查看>>
ArrayList源码分析
查看>>
golang后端库gin笔记
查看>>