web-dev-qa-db-fra.com

Vérification de la connexion Internet C #

Pouvez-vous s'il vous plaît me dire s'il existe un moyen de vérifier s'il existe une connexion Internet sur mon ordinateur lorsque mon programme C # est en cours d'exécution. Pour un exemple simple, si Internet fonctionne, je générerais une boîte de message disant Internet is available. sinon, je voudrais sortir un message disant, Internet is unavailable

Sans utiliser la fonction de bibliothèque pour voir si le réseau est disponible (puisque cela ne vérifie pas la connectivité Internet)

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

Ou sans ouvrir une page Web et voir si elle renvoie les données

using (WebClient client = new WebClient())
      htmlCode = client.DownloadString("http://google.com");

Parce que ces deux méthodes ci-dessus ne répondent pas à mes besoins.

19
D P.

une version un peu plus courte:

public static bool CheckForInternetConnection()
{
    try
    {
        using (var client = new WebClient())
        using (var stream = client.OpenRead("http://www.google.com"))
        {
            return true;
        }
    }
    catch
    {
        return false;
    }
}

Une autre option est:

Ping myPing = new Ping();
String Host = "google.com";
byte[] buffer = new byte[32];
int timeout = 1000;
PingOptions pingOptions = new PingOptions();
PingReply reply = myPing.Send(Host, timeout, buffer, pingOptions);
if (reply.Status == IPStatus.Success) {
  // presumably online
}

Vous pouvez trouver une discussion plus large ici

29
Ofir

Considérez l'extrait de code suivant ...

Ping myPing = new Ping();
String Host = "google.com";
byte[] buffer = new byte[32];
int timeout = 1000;
PingOptions pingOptions = new PingOptions();
PingReply reply = myPing.Send(Host, timeout, buffer, pingOptions);
if (reply.Status == IPStatus.Success) 
{
  // presumably online
}

Bonne chance!

8
gpmurthy

Ma classe NetworkMonitor fournit maintenant ceci (basé sur d'autres réponses ici):

    public bool IsInternetAvailable
    {
        get { return IsNetworkAvailable && _CanPingGoogle(); }
    }

    private static bool _CanPingGoogle()
    {
        const int timeout = 1000;
        const string Host = "google.com";

        var ping = new Ping();
        var buffer = new byte[32];
        var pingOptions = new PingOptions();

        try {
            var reply = ping.Send(Host, timeout, buffer, pingOptions);
            return (reply != null && reply.Status == IPStatus.Success);
        }
        catch (Exception) {
            return false;
        }
    }
1
Barton

vient d'écrire des fonctions asynchrones pour le faire:

private void myPingCompletedCallback(object sender, PingCompletedEventArgs e)
{
    if (e.Cancelled)
        return;

    if (e.Error != null)
        return;

    if (e.Reply.Status == IPStatus.Success)
    {
        //ok connected to internet, do something...
    }
}

private void checkInternet()
{
    Ping myPing = new Ping();
    myPing.PingCompleted += new PingCompletedEventHandler(myPingCompletedCallback);
    try
    {
        myPing.SendAsync("google.com", 3000 /*3 secs timeout*/, new byte[32], new PingOptions(64, true));
    }
    catch
    {
    }
}
1
winsetter

C'est mon approche

  1. Vérifiez qu’une connexion réseau est disponible, sinon, nous ne pourrons pas nous connecter à un autre hôte.
  2. Vérifiez si nous pouvons nous connecter à certains hôtes majeurs. Utilisez une solution de secours au cas où ce site ne serait pas disponible. 

    public static bool ConnectToInternet(int timeout_per_Host_millis = 1000, string[] hosts_to_ping = null)
    {
        bool network_available = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
    
        if (network_available)
        {
            string[] hosts = hosts_to_ping ?? new string[] { "www.google.com", "www.facebook.com" };
    
            Ping p = new Ping();
    
            foreach (string Host in hosts)
            {
                try
                {
                    PingReply r = p.Send(Host, timeout_per_Host_millis);
    
                    if (r.Status == IPStatus.Success)
                        return true;
                }
                catch { }
            }
        }
    
        return false;
    }
    

Remarques:

  1. N'utilisez pas trop d'hôtes lors de vos contacts, pesez le coût de la réalisation de tous les pings contre la diminution des chances de succès.
  2. Si nous envoyons le ping à un hôte auquel nous avons l'intention de nous connecter ultérieurement (par exemple, une requête http), un ping renvoyé ne signifie pas que nous sommes connectés à cet hôte. Considérez ce qui arriverait si l'hôte est bloqué. Par exemple, Facebook est bloqué en Iran, en Chine, ... Ce fournisseur d'accès Internet retourne-t-il le ping?
  3. Une requête DNS ne sera pas suffisante car elle peut être mise en cache
0
user425678