2009-02-06 12 views

Respuesta

135

Puede comprobar si hay una conexión de red en .NET 2.0 utilizando GetIsNetworkAvailable():

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() 

para monitorear los cambios en la dirección IP o cambios en la disponibilidad de la red utilizar los eventos de la clase NetworkChange:

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged 
System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged 
+8

¿Esto se ocupa de la "disponibilidad limitada"? – tofutim

+0

Esto no siempre funciona en WPF. Algunas computadoras portátiles devuelven falso y algunas devuelven verdadero – krilovich

+0

¿Esto realmente funciona? ¡Acabo de escribir esta línea y apago el enrutador y sigo siendo cierto! – Mushfiq

143

La respuesta marcada es 100% correcta, sin embargo, hay ciertos casos en que el método estándar es engañado por tarjetas virtuales (cuadro virtual, ...). También es deseable descartar algunas interfaces de red en función de su velocidad (puertos serie, módems, ...).

Aquí es una pieza de código que comprueba estos casos:

/// <summary> 
    /// Indicates whether any network connection is available 
    /// Filter connections below a specified speed, as well as virtual network cards. 
    /// </summary> 
    /// <returns> 
    ///  <c>true</c> if a network connection is available; otherwise, <c>false</c>. 
    /// </returns> 
    public static bool IsNetworkAvailable() 
    { 
     return IsNetworkAvailable(0); 
    } 

    /// <summary> 
    /// Indicates whether any network connection is available. 
    /// Filter connections below a specified speed, as well as virtual network cards. 
    /// </summary> 
    /// <param name="minimumSpeed">The minimum speed required. Passing 0 will not filter connection using speed.</param> 
    /// <returns> 
    ///  <c>true</c> if a network connection is available; otherwise, <c>false</c>. 
    /// </returns> 
    public static bool IsNetworkAvailable(long minimumSpeed) 
    { 
     if (!NetworkInterface.GetIsNetworkAvailable()) 
      return false; 

     foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) 
     { 
      // discard because of standard reasons 
      if ((ni.OperationalStatus != OperationalStatus.Up) || 
       (ni.NetworkInterfaceType == NetworkInterfaceType.Loopback) || 
       (ni.NetworkInterfaceType == NetworkInterfaceType.Tunnel)) 
       continue; 

      // this allow to filter modems, serial, etc. 
      // I use 10000000 as a minimum speed for most cases 
      if (ni.Speed < minimumSpeed) 
       continue; 

      // discard virtual cards (virtual box, virtual pc, etc.) 
      if ((ni.Description.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0) || 
       (ni.Name.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0)) 
       continue; 

      // discard "Microsoft Loopback Adapter", it will not show as NetworkInterfaceType.Loopback but as Ethernet Card. 
      if (ni.Description.Equals("Microsoft Loopback Adapter", StringComparison.OrdinalIgnoreCase)) 
       continue; 

      return true; 
     } 
     return false; 
    } 
+14

esto es correcto y merece muchas upvotes - me encontré con que el evento NetworkAvailabilityChanged mencionado en la respuesta aceptada, no se dispara de forma fiable, lo que probablemente es causada por los adaptadores virtuales como se menciona en esta respuesta – Marek

+1

1 para la comprobación adicional para las máquinas virtuales. Solo entra en este caso ayer. Pero todavía creo que esto no maneja 'Hype-V', debido a que no tienen 'virtual' en su nombre. – Herdo

+1

@Herdo - sí, el código no es perfecto, y no creo que * pueda * haber nada perfecto en un mundo virtual. Pero puedes mejorarlo. –

8

Microsoft Windows Vista y 7 uso NCSI (Indicador de estado de conectividad de la red) técnica:

  1. NCSI realiza una búsqueda de DNS en www.msftncsi.com, luego solicita http://www.msftncsi.com/ncsi.txt. Este archivo es un archivo de texto plano y contiene solo el texto 'Microsoft NCSI'.
  2. NCSI envía una solicitud de búsqueda de DNS para dns.msftncsi.com. Esta dirección DNS debe resolverse a 131.107.255.255. Si la dirección no coincide, se supone que la conexión a Internet no funciona correctamente.
+2

Esto es genial, pero técnicamente no se trata de la disponibilidad de una 'red', sino más '¿tengo conectividad a Internet a través de http?' Puede tener conexiones de red perfectas pero no conectividad a Internet, por ejemplo, en una LAN independiente. Consulte para obtener más información sobre NCSI: http://technet.microsoft.com/en-us/library/cc766017.aspx – MichielB

1

llama a este método para comprobar la conexión de red.

public static bool IsConnectedToInternet() 
     { 
      bool returnValue = false; 
      try 
      { 

       int Desc; 
       returnValue = Utility.InternetGetConnectedState(out Desc, 0); 
      } 
      catch 
      { 
       returnValue = false; 
      } 
      return returnValue; 
     } 

Coloque esta línea de código debajo.

[DllImport("wininet.dll")] 
     public extern static bool InternetGetConnectedState(out int Description, int ReservedValue); 
Cuestiones relacionadas