|
@@ -10,6 +10,9 @@
|
|
|
#include <WinVer.h>
|
|
|
#pragma comment(lib,"version.lib")
|
|
|
#include "CritSection.h"
|
|
|
+// 获取本机ip地址;
|
|
|
+#include <Iphlpapi.h>
|
|
|
+#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
|
|
|
|
|
|
namespace Global
|
|
|
{
|
|
@@ -1083,4 +1086,80 @@ namespace Global
|
|
|
_tsetlocale(LC_CTYPE, old_locale);
|
|
|
free(old_locale); //还原区域设定;
|
|
|
}
|
|
|
+
|
|
|
+ std::string GetLocalAddress(int nType/*= MIB_IF_TYPE_ETHERNET*/)
|
|
|
+ {
|
|
|
+ std::string strAddress;
|
|
|
+ int nCardNo = 1;
|
|
|
+ // PIP_ADAPTER_INFO结构体指针存储本机网卡信息
|
|
|
+ PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
|
|
|
+ // 得到结构体大小,用于GetAdaptersInfo参数
|
|
|
+ unsigned long stSize = sizeof(IP_ADAPTER_INFO);
|
|
|
+ // 调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
|
|
|
+ int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
|
|
|
+ // 记录网卡数量
|
|
|
+ int netCardNum = 0;
|
|
|
+ // 记录每张网卡上的IP地址数量
|
|
|
+ int IPnumPerNetCard = 0;
|
|
|
+ if(ERROR_BUFFER_OVERFLOW == nRel)
|
|
|
+ {
|
|
|
+ // 如果函数返回的是ERROR_BUFFER_OVERFLOW
|
|
|
+ // 则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
|
|
|
+ // 这也是说明为什么stSize既是一个输入量也是一个输出量
|
|
|
+ // 释放原来的内存空间
|
|
|
+ delete pIpAdapterInfo;
|
|
|
+ // 重新申请内存空间用来存储所有网卡信息
|
|
|
+ pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
|
|
|
+ // 再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
|
|
|
+ nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(ERROR_SUCCESS == nRel)
|
|
|
+ {
|
|
|
+ // 输出网卡信息
|
|
|
+ // 可能有多网卡,因此通过循环去判断
|
|
|
+ while (pIpAdapterInfo)
|
|
|
+ {
|
|
|
+ // 可能网卡有多IP,因此通过循环去判断
|
|
|
+ IP_ADDR_STRING*pIpAddrString = &(pIpAdapterInfo->IpAddressList);
|
|
|
+ if ( pIpAdapterInfo->Type == nType )
|
|
|
+ {
|
|
|
+ return pIpAddrString->IpAddress.String;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+#if 0
|
|
|
+ switch(pIpAdapterInfo->Type)
|
|
|
+ {
|
|
|
+ case MIB_IF_TYPE_OTHER:
|
|
|
+ case MIB_IF_TYPE_ETHERNET:
|
|
|
+ case MIB_IF_TYPE_TOKENRING:
|
|
|
+ case MIB_IF_TYPE_FDDI:
|
|
|
+ case MIB_IF_TYPE_PPP:
|
|
|
+ case MIB_IF_TYPE_LOOPBACK:
|
|
|
+ case MIB_IF_TYPE_SLIP:
|
|
|
+ {
|
|
|
+ strAddress = pIpAddrString->IpAddress.String;
|
|
|
+ // 需要注意的是有时可能获取的IP地址是0.0.0.0,这时需要过滤掉
|
|
|
+ if(std::string("0.0.0.0") == strAddress)
|
|
|
+ break;
|
|
|
+ std::cout<<_T("第")<<nCardNo<<_T("张网卡的IP地址是")<<strAddress<<std::endl;
|
|
|
+ nCardNo++;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ // 未知类型网卡就跳出
|
|
|
+ break;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ pIpAdapterInfo = pIpAdapterInfo->Next;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 释放内存空间
|
|
|
+ if (pIpAdapterInfo)
|
|
|
+ {
|
|
|
+ delete pIpAdapterInfo;
|
|
|
+ }
|
|
|
+
|
|
|
+ return std::string();
|
|
|
+ }
|
|
|
};
|