以下方法只限用在windows平台下
//获取本地ip
int getLocalIp(string& destIp, string& pIpAddr)
{
sockaddr_in dest;
dest.sin_family = AF_INET;
dest.sin_addr.s_addr = inet_addr(destIp.c_str());
DWORD bestIfIndex = 0;
if ( NO_ERROR != GetBestInterface(dest.sin_addr.s_addr,&bestIfIndex) )
{
return -1;
}
PMIB_IPADDRTABLE pIpAddrTable = (MIB_IPADDRTABLE *) HeapAlloc(GetProcessHeap(), 0, sizeof (MIB_IPADDRTABLE));
ULONG addrSize = 0;
if (ERROR_INSUFFICIENT_BUFFER == GetIpAddrTable(pIpAddrTable,&addrSize,FALSE))
{
HeapFree(GetProcessHeap(), 0, pIpAddrTable);
pIpAddrTable = (PMIB_IPADDRTABLE) HeapAlloc(GetProcessHeap(), 0, addrSize);
}
else
{
return -1;
}
sockaddr_in sourceIP;
memset(&sourceIP,0,sizeof(sockaddr_in));
if (NO_ERROR == GetIpAddrTable(pIpAddrTable,&addrSize,FALSE))
{
for(DWORD i = 0;i < pIpAddrTable->dwNumEntries; ++i )
{
DWORD dwAddr = pIpAddrTable->table[i].dwAddr;
if ( pIpAddrTable->table[i].dwIndex == bestIfIndex )
{
sourceIP.sin_addr.s_addr = dwAddr;
sourceIP.sin_family = AF_INET;
break;
}
}
}
if (pIpAddrTable != NULL)
{
HeapFree(GetProcessHeap(), 0, pIpAddrTable);
pIpAddrTable = NULL;
}
pIpAddr = inet_ntoa(sourceIP.sin_addr);
return 0;
}
需要用到头文件有
#include <iphlpapi.h >
还需要在工程属性中添加 iphlpapi.lib