|  | @@ -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();
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  };
 |