Comment vérifier une connexion réseau?


Réponses:


153

Vous pouvez rechercher une connexion réseau dans .NET 2.0 en utilisant GetIsNetworkAvailable():

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

Pour surveiller les changements d'adresse IP ou les changements de disponibilité du réseau, utilisez les événements de la classe NetworkChange :

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged
System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged

9
Cela tient-il compte de la «disponibilité limitée»?
tofutim le

Cela ne fonctionne pas toujours dans WPF. Certains ordinateurs portables retournent faux et certains retournent vrai
krilovich

Est-ce vraiment du travail? Je viens d'écrire cette ligne et d'éteindre mon routeur et retourne toujours vrai!
Mushfiq

1
NetworkInterface.GetIsNetworkAvailable()a été très peu fiable dans mon application (.NET 4.5, Windows 10), en particulier lors de l'exécution dans une machine virtuelle. La gestion des événements de NetworkAvailabilityChangeda été fiable.
eskimwier le


174

La réponse marquée est 100% correcte, cependant, il existe certains cas où la méthode standard est trompée par des cartes virtuelles (boîte virtuelle, ...) Il est également souvent souhaitable de supprimer certaines interfaces réseau en fonction de leur vitesse (ports série, modems, ...).

Voici un morceau de code qui vérifie ces cas:

    /// <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;
    }

17
cela est correct et mérite de nombreuses votes favorables - j'ai trouvé que l'événement NetworkAvailabilityChanged mentionné dans la réponse acceptée n'est pas déclenché de manière fiable, ce qui est probablement causé par des adaptateurs virtuels comme mentionné dans cette réponse
Marek

1
+1 pour le contrôle supplémentaire pour les machines virtuelles. Rencontrez ce cas hier. Mais je pense toujours que cela ne gère pas «Hype-V», car ils n'ont pas de «virtuel» dans leur nom.
Herdo

3
@Herdo - oui, le code n'est pas parfait, et je ne pense pas qu'il puisse y avoir quelque chose de parfait dans un monde virtuel. Mais vous pouvez l'améliorer.
Simon Mourier

@SimonMourier Vous avez raison. Je voulais juste noter que, si quelqu'un est toujours retourné vrai, s'il n'y a pas de connexion -> Cela pourrait être un problème :)
Herdo

1
@noelicus - Sur les projets sur lesquels j'ai travaillé jusqu'à présent, j'ai implémenté un système de surveillance / interrogation périodique (requêtes HTTP GET simples car je visais un serveur web) qui déclenche des événements lorsque le serveur est détecté comme "down" (non accessible par HTTP) ou "up" (accessible à nouveau). Dans le cas général, vous pouvez définir ce que signifie «fiable» dans votre cas et implémenter une logique similaire.
Simon Mourier

9

Microsoft Windows Vista et 7 utilisent la technique NCSI (Network Connectivity Status Indicator):

  1. NCSI effectue une recherche DNS sur www.msftncsi.com, puis demande http://www.msftncsi.com/ncsi.txt . Ce fichier est un fichier de texte brut et contient uniquement le texte « Microsoft NCSI ».
  2. NCSI envoie une demande de recherche DNS pour dns.msftncsi.com. Cette adresse DNS doit être résolue en 131.107.255.255. Si l'adresse ne correspond pas, on suppose que la connexion Internet ne fonctionne pas correctement.

3
C'est génial, mais ce n'est pas techniquement une question de disponibilité d'un «réseau», mais plutôt «ai-je une connectivité Internet via http?» Vous pouvez avoir des connexions réseau parfaites mais pas de connectivité à Internet, par exemple sur un réseau local autonome. Voir pour plus d'informations sur NCSI: technet.microsoft.com/en-us/library/cc766017.aspx
MichielB

1

Appelez cette méthode pour vérifier la connexion réseau.

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

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

Mettez ceci sous la ligne de code.

[DllImport("wininet.dll")]
        public extern static bool InternetGetConnectedState(out int Description, int ReservedValue);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.