• VC获取物理网卡的MAC地址


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

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

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

      printf("Adapter Addr: ");

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

      {

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

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

      }

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

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

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

      }

      pAdapter = pAdapter->Next;

      }

      }

      else

      {

      printf("Call to GetAdaptersInfo failed. ");

      }

      return 0;

      }

  • 相关阅读:
    Python
    deleted
    deleted
    ZOJ 3593 One Person Game(ExGcd + 最优解)题解
    ZOJ 3609 Modular Inverse(扩展欧几里得)题解
    P2234 [HNOI2002]营业额统计(Splay树)题解
    FJUT seventh的tired树上路径(01字典树)题解
    HDU 4825 Xor Sum(01字典树)题解
    Newcoder Metropolis(多源最短路 + Dijkstra堆优化)题解
    HDU 5938 Four Operations(乱搞)题解
  • 原文地址:https://www.cnblogs.com/lxshanye/p/3721912.html
Copyright © 2020-2023  润新知