获取网卡信息(网卡MAC,ip,index,devicename)的一般方法(利用IP HELPER api)

来源:互联网 发布:数据库中查找学生名字 编辑:程序博客网 时间:2024/05/30 04:41
首先再头文件中加入
#include <Iphlpapi.h>
#pragma comment(lib,"Iphlpapi.lib")
//以上表示引用一些必要的struct
typedef struct tagAdapterInfo
{
 char szDeviceName[128];              // 名字
 char szIPAddrStr[16];                  // IP
 char szHWAddrStr[18];                // MAC
 DWORD dwIndex;                     // 编号         
 bool filled;//是否取得了网卡信息
}INFO_ADAPTER, *PINFO_ADAPTER;
//以上是定义存储网卡信息的结构体
INFO_ADAPTER AdapterList[NetCardNumber];
//如果有多块网卡,分别取得每块的信息,结果放在上面的结构体数组中,其中NetCardNumber是#define的一个const
在源文件中加入下列函数
void CReadNetCardInfo::GetAdapterInfo()
{
 char tempChar;
 ULONG uListSize=1;
 PIP_ADAPTER_INFO pAdapter;   // 定义PIP_ADAPTER_INFO结构存储网卡信息
 int nAdapterIndex = 0;
 DWORD dwRet = GetAdaptersInfo((PIP_ADAPTER_INFO)&tempChar, &uListSize); // 关键函数
 if (dwRet == ERROR_BUFFER_OVERFLOW)
 {
  PIP_ADAPTER_INFO pAdapterListBuffer = (PIP_ADAPTER_INFO)new(char[uListSize]);
  dwRet = GetAdaptersInfo(pAdapterListBuffer, &uListSize);
  if (dwRet == ERROR_SUCCESS)
  {
   pAdapter = pAdapterListBuffer;
   while (pAdapter) // 枚举网卡
   {
    CString strTemp;
    //strTemp.Format(_T("%s"),pAdapter->AdapterName);   // 网卡名字
    //strTemp = CString("//Device//NPF_") + strTemp;    // 加上前缀
    //strcpy(AdapterList[nAdapterIndex].szDeviceName,strTemp);
    //strcpy(AdapterList[nAdapterIndex].szIPAddrStr, pAdapter->IpAddressList.IpAddress.String );// IP
    FormatMACToStr( AdapterList[nAdapterIndex].szHWAddrStr,pAdapter->Address ); // MAC!
    AdapterList[nAdapterIndex].dwIndex = pAdapter->Index;        // 编号
    AdapterList[nAdapterIndex].filled = true;
    pAdapter = pAdapter->Next;
    nAdapterIndex ++;
   }
   delete pAdapterListBuffer;
  }
 }
}
/*所有的信息都放入了pAdapter中,我只取了网卡MAC,其余的注释掉了,FormatMACToStr是格式化函数,加入一些必要的格式化字符,看起来会漂亮一些,代码见下*/
void CReadNetCardInfo::FormatMACToStr(LPSTR lpHWAddrStr,const unsigned char *HWAddr)
{
 int i;
 short temp;
 char szStr[3];
 strcpy(lpHWAddrStr, "");
 for (i=0; i<6; ++i)
 {
  temp = (short)(*(HWAddr + i));
  _itoa(temp, szStr, 16);
  if (strlen(szStr) == 1)  strcat(lpHWAddrStr, "0");
  strcat(lpHWAddrStr, szStr);
//  if ( i < 5 ) strcat(lpHWAddrStr, "-");         // 加上 -
 }
}
//当运行完后,取得的信息放在了AdapterList里面,可以取来做其他用途。此篇文章是接上篇网卡MAC地址所写,因为发现上篇文章的方法有时候是不能取得网卡MAC地址的,这个方法就要可靠一些,当然,是不是万能的,我也不知道,以后慢慢试着用吧。