程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> VC 獲取物理網卡的MAC地址

VC 獲取物理網卡的MAC地址

編輯:vc教程

  獲取網卡的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"
#pragMacomment(lib,"Iphlpapi.lib")
intmain(intargc,char*argv[])
{
  PIP_ADAPTER_INFOpAdapterInfo;
  PIP_ADAPTER_INFOpAdapter=NULL;
  DWorddwRetVal=0;
  pAdapterInfo=(IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO));
  ULONGulOutBufLen=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("AdapterName:t%sn",pAdapter->AdapterName);
        printf("AdapterDesc:t%sn",pAdapter->Description);
        printf("AdapterAddr:t");
        for(UINTi=0;i<pAdapter->AddressLength;i++)
        {
          printf("%02X%c",pAdapter->Address[i],
                  i==pAdapter->AddressLength-1?'n':'-');
        }
        printf("AdapterType:t%dn",pAdapter->Type);
        printf("IPAddress:t%sn",pAdapter->IpAddressList.IpAddress.String);
        printf("IPMask:t%sn",pAdapter->IpAddressList.IpMask.String);
      }
      pAdapter=pAdapter->Next;
    }
  }
  else
  {
    printf("CalltoGetAdaptersInfofailed.n");
  }
  return0;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved