22 Stimmen

Der schnellste Weg, die Internetverbindung zu testen

C# 2008 SP1

Ich verwende diesen Code, um eine Verbindung zu unserer Kunden-Website herzustellen. Dies ist für eine Softphone-Anwendung. Bevor der Benutzer einen Anruf tätigt, muss das Softphone prüfen, ob eine aktive Internetverbindung besteht.

Ich habe also die httpWebRequest-Klasse verwendet, um eine Verbindung zur Website unserer Kunden herzustellen. Wenn die Antwort in Ordnung ist, kann die Internetverbindung hergestellt werden.

Allerdings habe ich festgestellt, dass die Antwort zu lange auf sich warten lässt. Ich bin mir nicht sicher, ob dies nicht ein sehr effizienter Weg zum Testen ist.

Wenn ich jedoch ihre Website aufrufe, dauert es weniger als eine Sekunde, bis die Seite geladen ist. Aber es dauert zu lange, wenn ich die Klasse HttpWebRequest verwende

Die Voraussetzungen dafür sind also:

In manchen Fällen wird ein Bevollmächtigter im Büro des Kunden eingesetzt. Dazu kann ich die TCPClient-Klasse nicht verwenden (hat keine Proxy-Eigenschaft).

Der Proxy unterstützt SOCKS nicht und kann daher die Klasse Sockets nicht verwenden.

Ich muss eine Timeout-Eigenschaft verwenden. Daher kann ich die WebClient-Klasse nicht verwenden. Der Grund dafür ist, dass das Softphone einfrieren würde, bis eine Antwort zurückgegeben wird. Also Timeout nach ein paar Sekunden.

Also die einzige, die mir einfällt, ist die Klasse HttpWebRequest.

  HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.xxxxxxxxx.com");
            request.Timeout = 5000;
            request.Credentials = CredentialCache.DefaultNetworkCredentials;
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            if (response.StatusCode == HttpStatusCode.OK)
            {
                Console.WriteLine("IsSIPServerAvailable: " + response.StatusCode);
                isAvailable = true;
            }

\======== Bearbeiten mit p \Invoke ====

 [DllImport("wininet.dll", CharSet = CharSet.Auto)]
    private extern static bool InternetGetConnectedState(ref InternetConnectionState_e lpdwFlags, int dwReserved);

 [Flags]
    enum InternetConnectionState_e : int
    {
        INTERNET_CONNECTION_MODEM = 0x1,
        INTERNET_CONNECTION_LAN = 0x2,
        INTERNET_CONNECTION_PROXY = 0x4,
        INTERNET_RAS_INSTALLED = 0x10,
        INTERNET_CONNECTION_OFFLINE = 0x20,
        INTERNET_CONNECTION_CONFIGURED = 0x40
    }

 // In function for checking internet
 InternetConnectionState_e flags = 0;          
 bool isConnected = InternetGetConnectedState(ref flags, 0);

1voto

Naresh Bisht Punkte 378

Verwenden Sie die Ausnahmebehandlung.

        try
        {
            using (WebClient client = new WebClient())
            {
                string htmlCode = client.DownloadString("https://www.google.com/");                    
            }
        }
        catch
        {
            //No Internet 
            Console.WriteLine("No Internet")
        }

0voto

Nyerguds Punkte 4916

request.GetResponse() selbst gibt eine Ausnahme aus, wenn der Hostname nicht aufgelöst werden kann, daher sollten Sie eine try-catch-Funktion einfügen, catch System.Net.WebException und prüfen Sie den Fehlerstatus in der Status Eigentum. Ich bin mir allerdings nicht sicher, welche Zustände genau auf kein Internet hindeuten; die meisten Antworten könnten ebenso gut auf DNS- oder andere Verbindungsprobleme zurückzuführen sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X