`

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

 
阅读更多
首先再头文件中加入
#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地址的,这个方法就要可靠一些,当然,是不是万能的,我也不知道,以后慢慢试着用吧。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics