2010-12-16 15 views
23

Estamos desarrollando una aplicación .NET donde uno de los requisitos es monitorear si el sistema está conectado a Internet o no.Necesito un evento para detectar la conexión/desconexión de Internet

Pudimos obtener un evento .NET para "desconexión del cable de ethernet", pero si el módem se reinicia, este evento no se activará. No quiero seguir haciendo ping a alguna URL para hacerlo, ya que agregará una sobrecarga de rendimiento considerable. ¿Hay algún evento .NET que pueda verificar si el sistema está conectado a internet o no?

Hay un icono en la bandeja del sistema que muestra un signo de cruz o un signo de conectividad limitada cuando el sistema no está conectado a internet. Eso sugiere que Windows sabe, y quiero atrapar ese evento.

+0

Consulte también: http://stackoverflow.com/questions/6197954/get-windows-7s-network-status –

Respuesta

10

Esto está todo cubierto (incluida la diferencia entre estar en la red y hacer que la red lo conecte a Internet) al http://msdn.microsoft.com/en-us/library/ee264321(VS.85).aspx. Espero que quisieras poner esa etiqueta de Windows 7 en tu publicación, porque todo esto es bastante nuevo.

La clave es INetworkListManager.get_IsConnectedToInternet() que hace más o menos lo que dice en la lata. Tienes que saltar un poco para registrarte para los eventos, etc. El Code Pack envuelve parte de eso y tiene una muestra de red que puedes adaptar.

+0

Gracias. Fue una buena lectura. Todavía tengo que implementarlos y verificar si resuelve mi problema. – Nuetrino

0

tienes que usar WMI.

Este es un ejemplo para la detección de desconexión: (a probarlo crear un archivo .vbs y ejecutarlo)

strComputer = "." 

    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\wmi") 
    Set colMonitoredEvents = objWMIService.ExecNotificationQuery _ 
    ("Select * from MSNdis_StatusMediaDisconnect") 

    Do While True 
    Set strLatestEvent = colMonitoredEvents.NextEvent 
    Wscript.StdOut.Write "A network connection has been lost: " 
    Wscript.StdOut.Writeline strLatestEvent.InstanceName 
    Loop 
18

Usted puede utilizar la clase NetworkChange, con el NetworkAvailabilityChanged evento:

NetworkChange.NetworkAvailabilityChanged += myNetworkAvailabilityChangeHandler; 

Dado que es un evento del sistema, asegúrese de eliminar el evento cuando haya terminado, consulte esta publicación aquí: You need to be careful about using event handler for NetworkChange

+0

Gracias por su respuesta. actualmente somos el mismo evento para la desconexión de la red. Pero este evento se activa solo cuando se elimina el cable Ethernet y no cuando la red se apaga debido a un reinicio del módem. En Windows-7 puede ver un icono de la bandeja del sistema para Lan Connection que a veces muestra una conectividad limitada con un (símbolo de peligro) que muestra Sin acceso a Internet cuando hace un mouseover. y cuando se restablece Internet, nuevamente se vuelve a conectar. – Nuetrino

+1

Continua ... Tenía curiosidad de saber si ese evento en particular puede quedar atrapado. Google buscó en muchas ocasiones las únicas respuestas es hacer ping al servidor y ver si está conectado o no y eso supondría una sobrecarga de rendimiento considerable para la aplicación que descarté. – Nuetrino

+0

Este mensaje de "conectividad limitada" depende mucho del contexto, por ejemplo, si está detrás de muchos enrutadores.Si realmente quieres saber si estás "conectado a internet", necesitas definir lo que quieres decir con eso. En el caso general, lo mejor es conectarse al punto final que le interesa (tal vez en otro hilo con temporizador). Tenga en cuenta también que los pings a veces están prohibidos por los firewalls. Si necesita HTTP, debe probar el puerto 80, si necesita HTTPS, debe probar 443, etc ... –

2

¡Esto funcionó para mí!

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net.NetworkInformation; 
namespace ConsoleApplication6 
{ 


    class Program 
    { 
     private void AvailabilityChanged(object sender, NetworkAvailabilityEventArgs e) 
     { 

      if (e.IsAvailable) 
       Console.WriteLine("Network connected!"); 
      else 
       Console.WriteLine("Network dis connected!"); 
     } 
     public void Form1() 
     { 

      NetworkChange.NetworkAvailabilityChanged += AvailabilityChanged; 
     } 

     static void Main(string[] args) 
     { 
      Program p = new Program(); 

      p.Form1(); 

      Console.ReadLine(); 

     } 
    } 
} 
1

tratar con esto:

private void AvailabilityChanged(object sender, NetworkAvailabilityEventArgs e) 
     { 
      if (e.IsAvailable) 
       Console.WriteLine("Wi-Fi conectado " + DateTime.Now); 
      else 
       Console.WriteLine("Wi-Fi desconectado " + DateTime.Now); 
     } 


     public Inicio() 
     { 
      InitializeComponent(); 

      NetworkAvailabilityChangedEventHandler myHandler = new NetworkAvailabilityChangedEventHandler(AvailabilityChanged); 
      NetworkChange.NetworkAvailabilityChanged += myHandler; 
     } 
Cuestiones relacionadas