91 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
| // PHZ
 | |
| // 2018-5-15
 | |
| 
 | |
| #include "NetInterface.h"
 | |
| #include "Socket.h"
 | |
| 
 | |
| using namespace xop;
 | |
| 
 | |
| std::string NetInterface::GetLocalIPAddress()
 | |
| {
 | |
| #if defined(__linux) || defined(__linux__) 
 | |
|     SOCKET sockfd = 0;
 | |
|     char buf[512] = { 0 };
 | |
|     struct ifconf ifconf;
 | |
|     struct ifreq  *ifreq;
 | |
|     sockfd = socket(AF_INET, SOCK_DGRAM, 0);
 | |
|     if (sockfd == INVALID_SOCKET)
 | |
|     {
 | |
|         close(sockfd);
 | |
|         return "0.0.0.0";
 | |
|     }
 | |
| 
 | |
|     ifconf.ifc_len = 512;
 | |
|     ifconf.ifc_buf = buf;
 | |
|     if (ioctl(sockfd, SIOCGIFCONF, &ifconf) < 0)
 | |
|     {
 | |
|         close(sockfd);
 | |
|         return "0.0.0.0";
 | |
|     }
 | |
| 
 | |
|     close(sockfd);
 | |
| 
 | |
|     ifreq = (struct ifreq*)ifconf.ifc_buf;
 | |
|     for (int i = (ifconf.ifc_len / sizeof(struct ifreq)); i>0; i--)
 | |
|     {
 | |
|         if (ifreq->ifr_flags == AF_INET)
 | |
|         {
 | |
|             if (strcmp(ifreq->ifr_name, "lo") != 0)
 | |
|             {
 | |
|                 return inet_ntoa(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr);
 | |
|             }
 | |
|             ifreq++;
 | |
|         }
 | |
|     }
 | |
|     return "0.0.0.0";
 | |
| #elif defined(WIN32) || defined(_WIN32)
 | |
|     PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
 | |
|     unsigned long size = sizeof(IP_ADAPTER_INFO);
 | |
| 
 | |
|     int ret = GetAdaptersInfo(pIpAdapterInfo, &size);
 | |
|     if (ret == ERROR_BUFFER_OVERFLOW)
 | |
|     {
 | |
|         delete pIpAdapterInfo;
 | |
|         pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[size];
 | |
|         ret = GetAdaptersInfo(pIpAdapterInfo, &size);
 | |
|     }
 | |
| 
 | |
|     if (ret != ERROR_SUCCESS)
 | |
|     {
 | |
|         delete pIpAdapterInfo;
 | |
|         return "0.0.0.0";
 | |
|     }
 | |
| 
 | |
|     while (pIpAdapterInfo)
 | |
|     {
 | |
|         IP_ADDR_STRING *pIpAddrString = &(pIpAdapterInfo->IpAddressList);
 | |
|         while(pIpAddrString)
 | |
|         {
 | |
|             if (strcmp(pIpAddrString->IpAddress.String, "127.0.0.1")!=0
 | |
|                 && strcmp(pIpAddrString->IpAddress.String, "0.0.0.0")!=0)
 | |
|             {
 | |
|                 // pIpAddrString->IpMask.String 
 | |
|                 //pIpAdapterInfo->GatewayList.IpAddress.String
 | |
|                 std::string ip(pIpAddrString->IpAddress.String);
 | |
|                 //delete pIpAdapterInfo;
 | |
|                 return ip;
 | |
|             }		
 | |
|             pIpAddrString = pIpAddrString->Next;
 | |
|         } while (pIpAddrString);
 | |
|         pIpAdapterInfo = pIpAdapterInfo->Next;
 | |
|     }
 | |
| 
 | |
|     delete pIpAdapterInfo;
 | |
|     return "0.0.0.0";
 | |
| #else
 | |
|     return "0.0.0.0";
 | |
| #endif
 | |
| }
 | |
| 
 | |
| 
 |