Laden...

timeout - Onlinestatus Problem

Erstellt von a_maier56 vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.002 Views
A
a_maier56 Themenstarter:in
38 Beiträge seit 2006
vor 17 Jahren
timeout - Onlinestatus Problem

Hallo,

Ich muss in meiner Anwendung (innerhalb von ca. 1-2 Sekunden prüfen, ob eine Internetverbindung steht). Zuerst habe ich dafür die InternetGetConnectedState-Funktion verwendet (diese Funktioniert solange ich mit einem Netz verbunden bin, welches auch Internetverbindung hat). Wenn ich aber eine Verbindung zu einem LAN habe (InternetGetConnectedState liefert dann true), aber keine Verbindung zum Internet sollte mir meine IsOnline()-Funktion false zurückliefern (ich benötige nämlich den zugriff auf einen HTTP-Befehle, welche von einem Server angeboten werden!) Dann habe ich probiert die Onlineprüfung mit der Ping-Klasse aus dem .NET Framework 2.0 oder mit HTTPWebRequests auf den Server zu machen. Die geben mir zwar zuverlässig die richtige Info (Online oder Offline), aber das dauert brutal lang (manchmal 10 Sekunden und noch länger) EGAL welchen timeout ich gesetzt habe (ob mit Ping, oder mit HTTPWebRequest)???
Kann mir jemand helfen?
Mir wäre schon geholfen, wenn die timeout-Angaben richtig ziehen würden (also z.B. wenn er nach 2 Sekunden nicht antwortet als nicht online kennzeichnen => aber wie gesagt der timeout zieht nicht wenn ich den Netzwerkstecker rausgezogen habe und den Request oder ping absetze => er braucht da viel länger als angegeben bis die timeout-Excpetion kommt???)
Wie könnte ich es hinbekommen die Prüfung zuverlässig in 1-2 Sekunden hinzubekommen??

Vielen Dank für eure Hilfe!

Gruß, Andi!

2.223 Beiträge seit 2005
vor 17 Jahren

hallo a_maier56,

versuche doch mal eine verbindung aufzubauen wenn sie nicht klappt biste meistens offline

(ja ich weiß nicht gerade sauber aber vileicht bekommst du es so schneller raus ob du online oder offline bist

eine weitere altenatieve wäre wenn du mit dem router kommunizieren könntest, dann könntest du den fragen ob er online ist (ich weiß leider nur das sowas geht aber leider nicht wie)

mfg

B
1.529 Beiträge seit 2006
vor 17 Jahren

eine weitere altenatieve wäre wenn du mit dem router kommunizieren könntest

Wenn es aktiviert ist => UPnP
Ansonsten => Verbindungsversuch wie blackcoin sagte

A
a_maier56 Themenstarter:in
38 Beiträge seit 2006
vor 17 Jahren

Ich habs jetzt so gemacht (ist zwar eine Art Hack 😉 aber für mein Problem optimal!) Ich lasse einen extra Thread (über einen Backgroundworker) schauen ob es eine Verbindung gibt. Wenn das nach 2 Sekunden nicht geglückt ist wird der Status als "Offline" gesetzt und der Thraed gestoppt => Ich erzwinge also slber den timeout von 2 Sekunden 🙂! (Und wenn InternetGetConnectedState sowieso schon false zurückgibt versuch ich gar nicht erst zu schauen, um Zeit zu sparen..)

Aber danke für eure Antworten!

Code:


        [DllImport("WININET")]
        static extern bool InternetGetConnectedState(
            ref InternetConnectionState lpdwFlags,
            int dwReserved);

        [Flags]
        enum InternetConnectionState : 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
        }

        static bool mOnline = false;

        public static bool IsOnline()
        {
            System.ComponentModel.BackgroundWorker bgwOnlineState;
            bgwOnlineState = new System.ComponentModel.BackgroundWorker();
            bgwOnlineState.DoWork += new System.ComponentModel.DoWorkEventHandler(bgwOnlineState_DoWork);
            try
            {
                InternetConnectionState flags = 0;
                if (InternetGetConnectedState(ref flags, 0))
                {
                    bgwOnlineState.RunWorkerAsync();
                    for (int i = 0; i < 3; i++) // give two seconds time => (4*500 milliseconds = 2000 milliseconds) 
                    {
                        Thread.Sleep(500); // look every 500 milliseconds
                        if (mOnline)
                        {
                            if (bgwOnlineState.IsBusy)
                            {
                                try { bgwOnlineState.CancelAsync(); }
                                catch { }
                            }
                            return true;
                        }
                        
                    }
                    if (bgwOnlineState.IsBusy)
                    {
                        try { bgwOnlineState.CancelAsync(); }
                        catch { }
                    }
                    return mOnline;
                }
                else
                    return false;
            }
            catch { return false; }
        }

        public static void bgwOnlineState_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            try
            {
                IPostSubmitter TransSubmitter = new PostSubmitter();
                string Result = TransSubmitter.Post("blablabla");
                if (Result.Substring(0, 9).ToLower() == "<!doctype")
                    mOnline = true;
                else
                    mOnline = false;
            }
            catch { mOnline = false; }
        }