【问题标题】:C++ Get Local IP address,differentiate between the VPN and local networkC++获取本地IP地址,区分VPN和本地网络
【发布时间】:2014-03-15 16:41:19
【问题描述】:

我的电脑连接到本地网络(以太网适配器),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位

【问题讨论】:

  • 你在 phe->h_addr_list[i] 上循环,但是如果它 > 1,你只会得到最后一个地址。
  • 你想用它做什么?基本上,是否是 VPN 是应用程序不应该知道或关心的链路层的实现细节。
  • @Peter:不,它不是重复的。这个问题要求在其他问题之上提供一些额外信息。
  • 您可能可以从 IP Helper 函数之一获取此信息,例如 GetAdaptersInfo()。

标签: c++ ip


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-09-22
    • 1970-01-01
    • 2013-01-16
    • 2011-10-11
    • 1970-01-01
    • 2021-01-14
    • 2012-09-29
    • 1970-01-01
    • 2017-08-16
    相关资源
    最近更新 更多