gpt4 book ai didi

C++获取本地IP地址,区分VPN和本地网络

转载 作者:行者123 更新时间:2023-11-30 04:34:30 32 4
gpt4 key购买 nike

我的电脑连接到 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++VS2008Win7 64位

最佳答案

几年后...刚遇到同样的问题,想出了解决办法。您可以使用 GetAdaptersInfo() 获取所有本地适配器,然后在列表中循环并选择第一个具有有效子网掩码和默认网关的适配器(我的 VPN 适配器没有)。如果您同时拥有带默认网关的 WiFi 和以太网!!,我想您可以使用“类型”字段来选择以太网。

这类似于 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 );

关于C++获取本地IP地址,区分VPN和本地网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5946704/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com