2010-12-16 2 views
23

Nous développons une application .NET où l'une des exigences est de surveiller si le système est connecté à Internet ou non.J'ai besoin d'un événement pour détecter la connexion/déconnexion Internet

Nous avons été en mesure d'obtenir un événement .NET pour "ethernet cable disconnect", mais si le modem est réinitialisé, cet événement ne se déclenche pas. Je ne veux pas continuer à envoyer une requête ping à certaines URL pour y arriver, car cela ajoutera des coûts considérables au niveau des performances. Y at-il un événement .NET qui peut vérifier si le système est connecté à Internet ou non?

Une icône dans la barre d'état système affiche un signe de croix ou un signe de connectivité limité lorsque le système n'est pas connecté à Internet. Cela suggère Windows sait, et je veux piéger cet événement.

+0

Voir aussi: http://stackoverflow.com/questions/6197954/get-windows-7s-network-status –

Répondre

10

Tout cela est couvert (y compris la différence entre être sur le réseau et avoir le réseau vous connecter à Internet) à http://msdn.microsoft.com/en-us/library/ee264321(VS.85).aspx. J'espère que vous avez voulu mettre cette étiquette de Windows 7 sur votre poste, parce que tout ceci est assez nouveau.

La clé est INetworkListManager.get_IsConnectedToInternet() qui fait à peu près ce qu'il dit sur l'étain. Vous devez sauter un peu pour vous inscrire aux événements, etc. Le Code Pack vous en remettra quelques-uns et vous aurez un échantillon de réseau que vous pourrez adapter.

+0

Merci. Ce fut une bonne lecture. Je suis encore à les implémenter et vérifier si cela résout mon problème. – Nuetrino

0

vous devez utiliser WMI.

Ceci est par exemple pour la détection de déconnexion: (pour le tester créer un fichier .vbs et l'exécuter)

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

Vous pouvez utiliser la classe NetworkChange, avec le NetworkAvailabilityChanged événement:

NetworkChange.NetworkAvailabilityChanged += myNetworkAvailabilityChangeHandler; 

Puisqu'il s'agit d'un événement système, assurez-vous de supprimer l'événement lorsque vous avez terminé, voir cet article ici: You need to be careful about using event handler for NetworkChange

+0

Merci pour votre réponse. nous sommes actuellement le même événement pour la déconnexion du réseau. Mais cet événement n'est déclenché que lorsque le câble Ethernet est retiré et non lorsque le réseau tombe en panne en raison d'une réinitialisation du modem. Sous Windows-7, vous pouvez voir une icône de la barre d'état système pour Lan Connection qui affiche parfois une connectivité limitée avec un (symbole de danger). Elle affiche Pas d'accès Internet lorsque vous passez la souris. et quand Internet est restauré, il se reconnecte à nouveau. – Nuetrino

+1

Suite ... J'étais juste curieux de savoir si cet événement particulier peut être piégé. Googled beaucoup les seules réponses est de ping sur le serveur et de voir si elle est connectée ou non et ce serait une surcharge de performance considérable pour l'application que j'ai exclu. – Nuetrino

+0

Ce message de "connectivité limitée" est très dépendant du contexte, par exemple si vous êtes derrière de nombreux routeurs.Si vous voulez vraiment savoir si vous êtes "connecté à Internet", vous devez définir ce que vous entendez par là. Dans le cas général, le mieux est de se connecter au point final qui vous intéresse (peut-être dans un autre thread avec minuterie). Notez également que les pings sont parfois interdits par les firewalls. Si vous avez besoin de HTTP, vous devez tester le port 80, si vous avez besoin de HTTPS, vous devez tester 443, etc ... –

2

Cela a fonctionné pour moi!

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

essayer avec ceci:

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; 
     } 
Questions connexes