Question C # vérifier la connexion Internet [dupliquer]


Cette question a déjà une réponse ici:

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

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

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

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

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

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


18
2017-12-01 05:49


origine


Réponses:


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


28
2017-12-01 06:15



Considérons 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
2017-12-01 05:59



il suffit d'écrire des fonctions asynchrones pour faire cela:

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
2018-02-15 10:07



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
2018-02-25 22:53



Ceci est mon approche

  1. Vérifiez qu'une connexion réseau est disponible, si ce n'est pas le cas, nous ne pourrons pas nous connecter à un autre hôte.
  2. Vérifiez si nous pouvons nous connecter à certains hôtes majeurs. Utilisez un repli juste 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 lorsque vous tentez d'atteindre vos objectifs, évaluez le coût en temps et en argent de toutes les pings contre la probabilité décroissante de succès.
  2. Si nous envoyons le ping à un certain hôte que nous avons l'intention de connecter ultérieurement (par exemple, une requête http), un ping renvoyé ne signifie pas que nous sommes connectés à cet hôte particulier. Considérez ce qui se passerait si l'hôte était bloqué. Par exemple, Facebook est bloqué en Iran, en Chine,… Est-ce que cet ISP renvoie le ping?
  3. Une requête DNS ne suffira pas car elle peut être mise en cache

0
2018-04-27 08:39



public static bool HasConnection()
{
    try
    {
        System.Net.IPHostEntry i = System.Net.Dns.GetHostEntry("www.google.com");
        return true;
    }
    catch
    {
        return false;
    }
}

-1
2017-07-10 14:19