[原blog文章]获取网卡信息(一)

来源:互联网 发布:云计算开发工程师 技能 编辑:程序博客网 时间:2024/04/29 22:36
今天仓库开库, 好歹发点东西出来纪念纪念撒. 整个以前写的东西发出来, 函数实现的功能可以说是非常实用的. 但是实现起来有点麻烦, 因为微软没有提供比较简单的方法. (除了获取ip地址除外). 被逼无奈(当时需要程序非常小.所以要尽可能的对代码进行优化. 其中的方法之一就是减少加载的lib文件.),只好自己总结过滤东西, 终于弄出一个比较巧的手段出来. (所以啊, 没事的时候,要多给自己压力才好.).

 

本系列共两篇文章, 本文罗列代码(函数). 可以拿来直接使用的函数. 不过要加上另外一篇文章中提供的 .h 文件才行....

有错别字(母),请自行更正. 其中 MAX_IP 可以定义为 16 .随你便,只要能保存到***.***.***.*** 就行. :D

//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/*******************************************************************
* 函数名称:GetLocalIP
* 功能描述: 获取网卡信息
* 参数列表:
* szIPAddr: 保存ip地址
* szIPMask: 保存子网掩码
* GateWay: 保存网关
* myMac: 保存mac地址
* 文件支持:
* #include "drIPHlpApi.h" //我组织的头文件, 在另外一篇文章中有说明.
* #include "stdio.h"
* #include "winsock2.h"
* 完成操作:
* 获取网卡的ip地址, 子网掩码, 网关, mac地址
* 说明:
* 处理失误, 只能读取到一组信息, 就是说双网卡就会漏掉东西
* 返回结果:
* 如上.
********************************************************************/
void GetLocalIP(char szIPAddr[MAX_IP], char szIPMask[MAX_IP], CHAR myMac[7], CHAR GateWay[MAX_IP])
{
HINSTANCE iphlpapi_dll;
iphlpapi_dll = LoadLibrary("iphlpapi.dll");
if(iphlpapi_dll == NULL)
{
cout<<"加载iphlpapi.dll出错"<<endl;
return;
}
lpGetAdaptersInfo = (GAI)GetProcAddress(iphlpapi_dll, "GetAdaptersInfo");

DWORD dwRet;
ULONG ulLen=6;
PIP_ADAPTER_INFO pAdapterInfo=0,pTmp=0;

dwRet = lpGetAdaptersInfo(pAdapterInfo, &ulLen);
if(dwRet != ERROR_BUFFER_OVERFLOW)
{
cout<<"不溢出才怪!"<<endl;
return;
}
pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulLen);
if(!pAdapterInfo)
{
cout<<"分配空间失败"<<endl;
return;
}
dwRet = lpGetAdaptersInfo(pAdapterInfo, &ulLen);
if(dwRet != ERROR_SUCCESS)
{
cout<<"获取网卡信息失败!"<<endl;
return;
}

pTmp = pAdapterInfo;

memcpy(myMac,pTmp->Address,6); //get the mac
memcpy(szIPAddr, (void *)&pTmp->IpAddressList.IpAddress, 16); //get the ip
memcpy(szIPMask, (void *)&pTmp->IpAddressList.IpMask, 16); //get the mask
memcpy(GateWay,(void *)&pTmp->GatewayList.IpAddress,16); //get the gateway

return;
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^