我的电脑连接到本地网络(以太网适配器),IP地址为10.3.3.3,并且连接到我的VPN(PPP适配器),IP地址为172.4.0.70
现在,我如何以编程方式获取本地IP(10.3.3.3)?
我使用以下代码进行了测试。
但我无法区分VPN和本地网络,我们非常感谢任何帮助。
WSAData .....;
char* address=NULL;
getLocalIP(&address);
int getLocalIP(char** raddr)
{
char ac[80];
if (gethostname(ac, sizeof(ac)) == SOCKET_ERROR)
{
return 1;
}
struct hostent *phe = gethostbyname(ac);
if (phe == 0)
{
return 1;
}
for (int i = 0; phe->h_addr_list[i] != 0; ++i)
{
struct in_addr addr;
memcpy(&addr, phe->h_addr_list[i], sizeof(struct in_addr));
//How can I tell if it's not VPN?
//if (isnotVPN){
*raddr=inet_ntoa(addr); //<== ip address
//break;}
}
return 0;
}
C ++ VS2008 Win7 64位
答案 0 :(得分:2)
几年后...... 刚遇到同样的问题,并找到了解决方案。您可以使用GetAdaptersInfo()获取所有本地适配器,然后在列表中循环并选择具有有效子网掩码和默认网关的第一个(我的VPN适配器没有)。 如果你有WiFi和带有默认网关的以太网!!,我想你可以使用Type字段来选择以太网..
这类似于MSDN上GetAdaptersInfo()的示例代码。
PIP_ADAPTER_INFO pAdapterInfo;
PIP_ADAPTER_INFO pAdapter = NULL;
DWORD dwRetVal = 0;
PIP_ADDR_STRING pIPAddrString, pIPGwString;
ULONG ulOutBufLen;
pAdapterInfo = (IP_ADAPTER_INFO *)malloc( sizeof( IP_ADAPTER_INFO ) );
if( !pAdapterInfo ); //Malloc Failed
ulOutBufLen = sizeof( IP_ADAPTER_INFO );
if( GetAdaptersInfo( pAdapterInfo, &ulOutBufLen ) == ERROR_BUFFER_OVERFLOW ) {
free( pAdapterInfo );
pAdapterInfo = (IP_ADAPTER_INFO *)malloc( ulOutBufLen );
if( !pAdapterInfo ); //Malloc Failed
}
if( ( dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) ) == NO_ERROR ) {
pAdapter = pAdapterInfo;
while( pAdapter ) {
pIPAddrString = &pAdapter->IpAddressList;
pIPGwString = &pAdapter->GatewayList;
while( pIPAddrString ) {
ULONG ulIPMask, ulIPGateway;
ulIPMask = ntohl( inet_addr( pIPAddrString->IpMask.String ) );
ulIPGateway = ntohl( inet_addr( pIPGwString->IpAddress.String ) );
if( !ulIPMask ) {
pIPAddrString = pIPAddrString->Next;
continue;
}
//First adapter with a default gateway
if ( ulIPGateway ) {
strncpy( GETYOURSTRINGHERE, pIPAddrString->IpAddress.String, sizeof(pIPAddrString->IpAddress.String));
free( pAdapterInfo );
return;
}
pIPAddrString = pIPAddrString->Next;
}
pAdapter = pAdapter->Next;
}
}
if ( pAdapterInfo )
free( pAdapterInfo );