it-swarm.com.de

C # Überprüfung der Internetverbindung

Können Sie mir bitte sagen, ob es eine Möglichkeit gibt, zu überprüfen, ob sich in meinem Computer eine Internetverbindung befindet, wenn mein C # -Programm läuft. Für ein einfaches Beispiel würde ich, wenn das Internet funktioniert, ein Meldungsfeld mit der Aufschrift Internet is available ausgeben. Andernfalls würde ich eine Nachricht ausgeben, die Internet is unavailable sagt. 

Ohne die Bibliotheksfunktion zu verwenden, um zu prüfen, ob ein Netzwerk verfügbar ist (da dies die Internetverbindung nicht prüft)

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

Oder ohne eine Webseite zu öffnen und zu sehen, ob sie Daten zurückgibt

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

Weil beide oben genannten Methoden meinen Bedürfnissen nicht entsprechen.

19
D P.

etwas kürzere Version:

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

Eine weitere Option ist:

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
}

Sie finden eine breitere Diskussion hier

29
Ofir

Betrachten Sie den folgenden Codeausschnitt ...

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
}

Viel Glück!

8
gpmurthy

Meine NetworkMonitor-Klasse bietet jetzt Folgendes (basierend auf anderen Antworten hier):

    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

schrieb gerade async-Funktionen, um das zu tun:

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

Das ist mein Ansatz.

  1. Überprüfen Sie, ob eine Netzwerkverbindung verfügbar ist. Wenn dies nicht der Fall ist, können wir keine Verbindung zu einem anderen Host herstellen.
  2. Prüfen Sie, ob wir eine Verbindung zu einigen wichtigen Hosts herstellen können. Verwenden Sie einen Fallback für den Fall, dass diese Site nicht verfügbar ist. 

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

Anmerkungen:

  1. Verwenden Sie nicht zu viele Hosts, wenn Sie nach außen greifen, und wägen Sie die Kosten für die Erstellung aller Pings gegen die abnehmende Erfolgswahrscheinlichkeit ab.
  2. Wenn wir den Ping an einen bestimmten Host senden, mit dem wir uns später verbinden möchten (z. B. eine http-Anfrage), bedeutet ein zurückgesendeter Ping nicht, dass wir mit diesem Host verbunden sind. Überlegen Sie, was passieren würde, wenn der Host blockiert wird. zB ist Facebook im Iran, China blockiert ... Gibt der ISP den Ping zurück?
  3. Eine DNS-Anfrage reicht nicht aus, da sie zwischengespeichert werden kann
0
user425678