web-dev-qa-db-fra.com

Comment puis-je vérifier une connexion réseau?

Quel est le meilleur moyen de déterminer s’il existe une connexion réseau?

108
Brad

Vous pouvez rechercher une connexion réseau dans .NET 2.0 à l'aide de GetIsNetworkAvailable() :

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

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

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged
System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged
146
Mitch Wheat

La réponse marquée est correcte à 100%, cependant, dans certains cas, la méthode standard est trompée par les 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;
    }
167
Simon Mourier

Microsoft Windows Vista et 7 utilisent la technique NCSI (indicateur de connectivité réseau):

  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 contenant uniquement le texte " Microsoft NCSI ".
  2. NCSI envoie une demande de recherche DNS pour dns.msftncsi.com. Cette adresse DNS doit résoudre à 131.107.255.255. Si l'adresse ne correspond pas, il est alors supposé que la connexion Internet ne fonctionne pas correctement.
9
Saleh Rahimzadeh

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 en dessous de la ligne de code.

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