- 2013-11-10 - Licence Fondamentale d'Informatique
samedi 16 novembre 2013

Comment faire pour vérifier s'il est connecté à l'Internet en C #


Comment faire pour vérifier s'il est connecté à l'Internet en C #

Il ya plusieurs  façons de vérifier si la connexion Internet est disponible en C #. Étrangement, la solution la plus optimale qui a fonctionné pour moi était celui que je m'y attendais le moins. Permettez-moi de vous présenter les trois principales approches et décrire les avantages et les inconvénients de chacun d'eux. Vous pouvez ensuite tirer vos propres conclusions quant à ce qui fonctionne le mieux pour votre tâche.

#1 – GetIsNetworkAvailable
La première solution est aussi la plus simple de tous. Il suffit d'appeler la fonction GetIsNetworkAvailable et la valeur  booléenne vous dira si l'ordinateur est connecté à un réseau. Et là réside le problème! Il reviendra vrai même si vous êtes connecté qu'à un réseau domestique et la connexion internet réelle est en panne. Il revient aussi vrai lorsque vous avez VMware ou autre logiciel de visualisation installé en raison des connexions réseau associées à VMware sont toujours.
using System.Net.NetworkInformation;

public static bool NetStatus()
{
    return NetworkInterface.GetIsNetworkAvailable();
}

#2 – NetworkAvailabilityChangedEventHandler

La deuxième solution fait usage de l'espace de noms System.Net.NetworkInformation qui donne accès aux données du réseau de trafic, des informations d'adresse réseau, et la notification des changements d'adresse pour l'ordinateur local. Le framework. NET nous informer via un rappel lorsqu'un réseau des changements de disponibilité. Bien que cette méthode est mieux que contrôler en permanence l'état en appelant la méthode GetIsNetworkAvailable, il souffre toujours des mêmes inconvénients. Il ne retourne false lorsque toutes les connexions réseau descendent et qui est un problème majeur pour les utilisateurs du logiciel de visualisation tels que VMware et des ordinateurs connectés à plusieurs réseaux, car le gestionnaire d'événement ne fournit aucune information quant au statut de la connexion réseau a changé.

using System.Net.NetworkInformation;

private void Form_Load(object sender, EventArgs e)
{
    NetworkChange.NetworkAvailabilityChanged += new NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged);
}

private void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e)
{
    if (e.IsAvailable)
    {
        MessageBox.Show("Available");
    }
    else
    {
        MessageBox.Show("Not available");
    }
}


#3 – NetworkAvailabilityChangedEventHandler

La troisième approche est la plus compliquée, mais vous obtenez une image complète de ce qui se passe avec les connexions réseau sur l'ordinateur. La principale fonctionnalité est fournie par la fonction GetAllNetworkInterfaces qui retourne exactement ce que son nom l'indique - un tableau de toutes les interfaces réseau. C'est à vous de les trier et de trouver l'information que vous cherchez. Le seul inconvénient de cette méthode est qu'elle semble utiliser un peu de bande passante de l'UC (environ 8% en moyenne, ce qui est beaucoup compte tenu que la minuterie est réglée à 500 ms). L'augmentation de l'utilisation du processeur était aussi la principale raison pour laquelle j'ai décidé de ne pas utiliser cette approche.

using System;
using System.Net.NetworkInformation;
using Timer=System.Threading.Timer;

namespace NetworkCheckApp
{
    public class NetworkStatusObserver
    {
        public event EventHandler<EventArgs> NetworkChanged;

        private NetworkInterface[] oldInterfaces;
        private Timer timer;

        public void Start()
        {
            timer = new Timer(UpdateNetworkStatus, null, new TimeSpan(0, 0, 0, 0, 500), new TimeSpan(0, 0, 0, 0, 500));

            oldInterfaces = NetworkInterface.GetAllNetworkInterfaces();
        }

        private void UpdateNetworkStatus(object o)
        {
            var newInterfaces = NetworkInterface.GetAllNetworkInterfaces();
            bool hasChanges = false;
            if (newInterfaces.Length != oldInterfaces.Length)
            {
                hasChanges = true;
            }
            if (!hasChanges)
            {
                for (int i = 0; i < oldInterfaces.Length; i++)
                {
                    if (oldInterfaces[i].Name != newInterfaces[i].Name || oldInterfaces[i].OperationalStatus != newInterfaces[i].OperationalStatus)
                    {
                        hasChanges = true;
                        break;
                    }
                }
            }

            oldInterfaces = newInterfaces;

            if (hasChanges)
            {
                RaiseNetworkChanged();
            }
        }

        private void RaiseNetworkChanged()
        {
            if (NetworkChanged != null)
            {
                NetworkChanged.Invoke(this, null);
            }
        }
    }
}












#4 – GetHostAddresses

La quatrième et dernière solution, que j'ai effectivement utilisé dans un de mes projets est basé sur Dns.GetHostAddresses () appel de fonction. L'appel est très rapide et je n'ai pas été en mesure de détecter toute utilisation de l'UC significative quand il a été utilisé sur une minuterie avec un intervalle de 500ms.
Quelqu'un peut faire valoir que, en utilisant un site Web existant, nous nous exposons à une situation où le site peut être en panne et nos diagnostics de connexion internet sera faux. Mais vraiment, quelles sont les chances de Google étant bas toute quantité importante de temps au cours des 10 prochaines années?


try
{
    string myAddress = "www.google.com";
    IPAddress[] addresslist = Dns.GetHostAddresses(myAddress);

    if (addresslist[0].ToString().Length > 6)
    {
        if (!ConnectionOnline)
        {
            ConnectionOnline = true;
        }
    }
    else
        if (ConnectionOnline)
        {
            ConnectionOnline = false;
        }
}
catch
{
groupe    {
        ConnectionOnline = false;
    }
}

 
-