VC 获取本地ip地址

来源:互联网 发布:js获取当前时间格转换 编辑:程序博客网 时间:2024/06/11 00:12

获取本地IP地址有两种做法。一种是使用gethostname函数,代码如下:


[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. bool CSocketComm::GetLocalAddress(std::string& strAddress)  
  2. {  
  3.     char strHost[HOSTNAME_SIZE] = { 0 };  
  4.   
  5.     // get host name, if fail, SetLastError is called  
  6.     if (SOCKET_ERROR != gethostname(strHost, sizeof(strHost)))  
  7.     {  
  8.         struct hostent* hp;  
  9.         hp = gethostbyname(strHost);  
  10.         if (hp != NULL && hp->h_addr_list[0] != NULL)  
  11.         {  
  12.             // IPv4: Address is four bytes (32-bit)  
  13.             if ( hp->h_length < 4)  
  14.                 return false;  
  15.   
  16.             // Convert address to . format  
  17.             strHost[0] = 0;  
  18.   
  19.             // IPv4: Create Address string  
  20.             sprintf(strHost, "%u.%u.%u.%u",  
  21.                 (UINT)(((PBYTE) hp->h_addr_list[0])[0]),  
  22.                 (UINT)(((PBYTE) hp->h_addr_list[0])[1]),  
  23.                 (UINT)(((PBYTE) hp->h_addr_list[0])[2]),  
  24.                 (UINT)(((PBYTE) hp->h_addr_list[0])[3]));  
  25.   
  26.             strAddress = strHost;  
  27.             return true;  
  28.         }  
  29.     }  
  30.     else  
  31.         SetLastError(ERROR_INVALID_PARAMETER);  
  32.   
  33.     return false;  
  34. }  

这种方法有一个弊端,就是只能获取一个网卡的ip地址,而且当你的机器上装有以太网卡和无线网卡,它优先获取的是无线网卡的地址。


第二种做法可以获取多个网卡的IP地址,代码如下:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include <Iphlpapi.h>  
  2. #pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库  
  3.   
  4. bool CSocketComm::GetLocalAddress()  
  5. {  
  6. std::string strAddress;  
  7. int nCardNo = 1;  
  8.     //PIP_ADAPTER_INFO结构体指针存储本机网卡信息  
  9.     PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();  
  10.     //得到结构体大小,用于GetAdaptersInfo参数  
  11.     unsigned long stSize = sizeof(IP_ADAPTER_INFO);  
  12.     //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量  
  13.     int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);  
  14.     //记录网卡数量  
  15.     int netCardNum = 0;  
  16.     //记录每张网卡上的IP地址数量  
  17.     int IPnumPerNetCard = 0;  
  18.     if (ERROR_BUFFER_OVERFLOW == nRel)  
  19.     {  
  20.         //如果函数返回的是ERROR_BUFFER_OVERFLOW  
  21.         //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小  
  22.         //这也是说明为什么stSize既是一个输入量也是一个输出量  
  23.         //释放原来的内存空间  
  24.         delete pIpAdapterInfo;  
  25.         //重新申请内存空间用来存储所有网卡信息  
  26.         pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];  
  27.         //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量  
  28.         nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);      
  29.     }  
  30.     if (ERROR_SUCCESS == nRel)  
  31.     {  
  32.         //输出网卡信息  
  33.         //可能有多网卡,因此通过循环去判断  
  34.         while (pIpAdapterInfo)  
  35.         {  
  36.             //可能网卡有多IP,因此通过循环去判断  
  37.             IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);  
  38.             switch(pIpAdapterInfo->Type)  
  39.             {  
  40.             case MIB_IF_TYPE_OTHER:  
  41.             case MIB_IF_TYPE_ETHERNET:  
  42.             case MIB_IF_TYPE_TOKENRING:  
  43.             case MIB_IF_TYPE_FDDI:  
  44.             case MIB_IF_TYPE_PPP:  
  45.             case MIB_IF_TYPE_LOOPBACK:  
  46.             case MIB_IF_TYPE_SLIP:  
  47.                 {  
  48.                     strAddress = pIpAddrString->IpAddress.String;  
  49.                // 需要注意的是有时可能获取的IP地址是0.0.0.0,这时需要过滤掉  
  50.                     if(std::string("0.0.0.0")==strAddress)  
  51.                         break;  
  52.            std::cout<<_T("第")<< nCardNo<<_T("张网卡的IP地址是")<< strAddress<<std::endl;  
  53.                      nCardNo++;  
  54.                      break;  
  55.                 }  
  56.             default:  
  57.                 // 未知类型网卡就跳出  
  58.                 break;  
  59.             }  
  60.             pIpAdapterInfo = pIpAdapterInfo->Next;  
  61.         }  
  62.     }  
  63.     //释放内存空间  
  64.     if (pIpAdapterInfo)  
  65.     {  
  66.         delete pIpAdapterInfo;  
  67.     }  
  68. }  
0 0