C ++ Получить локальный IP-адрес, разграничить VPN и локальную сеть - PullRequest
1 голос
/ 10 мая 2011

Мой компьютер подключен к локальной сети (адаптер Ethernet) с 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 64bit

1 Ответ

2 голосов
/ 15 марта 2014

Несколько лет спустя ... Просто столкнулся с той же проблемой и нашел решение. Вы можете использовать GetAdaptersInfo (), чтобы получить все локальные адаптеры, а затем прокрутить список и выбрать первый с допустимой маской подсети и шлюзом по умолчанию (у моего адаптера VPN его не было). Если у вас есть и WiFi, и Ethernet со шлюзами по умолчанию !!, я думаю, вы можете использовать поле Тип, чтобы выбрать Ethernet ..

Это похоже на пример кода для GetAdaptersInfo () в MSDN.

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 );
...