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
|
|
}
|
|
|
|
|