Pregunta

Considere la siguiente configuración:Una PC con Windows con una interfaz LAN y una interfaz WiFi (el estándar para cualquier computadora portátil nueva).Cada una de las interfaces puede estar conectada o desconectada de una red.Necesito una forma de determinar cuál de los adaptadores es el que está conectado a Internet, específicamente, en caso de que ambos estén conectados a redes diferentes, uno con conexión a Internet y otro sin ella.

Mi solución actual implica el uso de "IPHelper".Obtener la mejor interfaz" función y proporcionándole la dirección IP "0.0.0.0".

¿Tiene alguna otra solución que pueda sugerir a este problema?

Siguiendo algunas de las respuestas, permítanme dar más detalles:

  • Necesito esto porque tengo un producto que tiene que elegir a qué adaptador vincularse.No tengo forma de controlar la configuración de la red o el host donde se ejecutará el producto y por eso necesito una solución que sea lo más sólida posible, con la menor cantidad de suposiciones posibles.
  • Necesito hacer esto en código, ya que es parte de un producto.

@Chris Upchurch:Esto me hace depender de que google.com esté activo (normalmente no es un problema) y de cualquier firewall personal que pueda estar instalado para permitir el ping.

@Hasta que:Como dijo Steve Moon, confiar en la dirección del adaptador es algo arriesgado porque se hacen muchas suposiciones sobre la configuración de la red interna.

@Steve Luna:Mirar la tabla de enrutamiento parece una buena idea, pero en lugar de aplicar la lógica de enrutamiento yo mismo, estoy intentando usar "GetBestInterface" como se describe anteriormente.Creo que lo que debería hacer es exactamente lo que usted describió en su respuesta, pero no estoy realmente seguro.La razón por la que soy reacio a implementar mi propia "lógica de enrutamiento" es que hay más posibilidades de que me equivoque que si uso una biblioteca/API escrita y probada por personas más "incondicionales" de la red.

¿Fue útil?

Solución

Técnicamente, no existe ningún "conectado a Internet".La verdadera pregunta es qué interfaz se puede enrutar a una dirección deseada.En este momento, está consultando la "ruta predeterminada", la que se aplica si no existe una ruta específica al destino.Pero estás ignorando rutas específicas.

Afortunadamente, para el 99,9% de los usuarios domésticos, eso será suficiente.No es probable que tengan mucha tabla de enrutamiento, y GetBestInterface automáticamente preferirá la conexión por cable a la inalámbrica, por lo que debería estar bien.Agregue una opción de anulación para el 0,1% de los casos en los que comete un error y déjelo por terminado.

Pero, para uso corporativo, debería utilizar GetBestInterface para un destino específico; de lo contrario, tendrá problemas si alguien está en la misma LAN que su destino (lo que significa que debe utilizar la interfaz "interna", no la "externa"). ) o tiene una ruta específica a su destino (mi red interna podría conectarse con la red de su destino, por ejemplo).

Por otra parte, no estoy seguro de qué planeas hacer con este adaptador "conectado a Internet", por lo que puede que no sea gran cosa.

Otros consejos

Aparentemente, en Vista hay nuevas interfaces que permiten consultar la conectividad a Internet y más.Échale un vistazo al Interfaces NLM y específicamente en Conexión de red - Puede consultar específicamente si la conexión de red tiene conectividad a Internet utilizando el método GetConnectivity.

Ver también: Conciencia de red en Windows VistaDesafortunadamente, esto sólo está disponible en Vista, por lo que para XP tendría que mantener mi heurística original.

Yo miraría la tabla de enrutamiento.Cualquiera que sea la NIC que tenga una ruta 0.0.0.0 Y esté habilitada Y tenga la métrica más baja, es la NIC que actualmente envía paquetes a Internet.

Entonces, en mi caso, el superior es el 'NIC de Internet'.

IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0        10.0.0.10        10.0.0.51     20
          0.0.0.0          0.0.0.0        10.0.0.10        10.0.0.50     25
(much other stuff deleted)

Otra alternativa es hacer ping o GetBestInterface 4.2.2.2: este es un servidor DNS antiguo y venerable, actualmente en manos de GTEI;anteriormente por Sprint si no recuerdo mal.

Haga ping a google.com a través de cada NIC.

Inicio > Ejecutar > cmd.exe (esto funciona en XP y Vista): ipconfig /all

Esto muestra toda la información sobre las interfaces de su computadora.La interfaz "pública" debe tener una dirección IP pública.Para principiantes, no debería ser 192.168.x.x o 10.x.x.x :)

ejecutar traceroute en algún sitio público se lo mostrará.Por supuesto, puede haber más de una interfaz que le lleve hasta allí.

¿Mirar la tabla de enrutamiento?Generalmente, a menos que esté enrutando entre redes en Windows (lo cual es posible, pero inusual para una computadora cliente en estos días), la interfaz que contiene la ruta predeterminada tendrá la conexión a Internet.

Su pregunta no detalla por qué ni con qué está haciendo esto, por lo que no puedo brindar ningún detalle.La herramienta de línea de comando "ruta" puede ser de alguna ayuda, pero probablemente existan bibliotecas para cualquier lenguaje de programación que esté utilizando para ver la tabla de enrutamiento.

No puede confiar en la dirección IP de la interfaz (por ejemplo, suponiendo que una dirección RFC-1918 [192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8] no sea Internet) ya que la mayoría de los sitios tienen algún tipo de configuración de firewall o proxy NAT y la interfaz de "Internet" está realmente en una LAN "privada" que te permite acceder a Internet.

ACTUALIZAR:Según su información adicional, parece que tiene una solución decente.No estoy tan seguro de la elección de 0.0.0.0 ya que es un caso límite para la dirección IP; podría estar bien en su combinación particular de plataforma/idioma.Parece (según la descripción de la API) que podría simplemente especificar una dirección, entonces, ¿por qué no alguna dirección que se sepa que está en Internet, p.¿La dirección IP de su sitio web o algo más aleatorio como 65.66.67.68?Solo asegúrese de no elegir una de las direcciones rfc-1918, o el rango de host local (127.0.0.0/8), o multidifusión, cualquier otro rango reservado y cualquier dirección que se resuelva en .mil o .gov (mientras no No parece que getbestinterface envíe tráfico, sería malo descubrirlo haciendo que los federales derriben tu puerta...:)

Desde el punto de vista de la red, cualquiera de los dos podría estar enrutando a "Internet" en cualquier momento.Si cosas como el protocolo de árbol de expansión están habilitadas en un conmutador, es posible que lo que podría haber sido la tarjeta de enrutamiento al principio ya no lo sea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top