wie funktioniert RasConnectionNotification



  • mist das klappt nicht!

    kann mir vielleicht doch jemand helfen??
    das oben genannte prog sagt *immer* das es connected ist.

    vielen dank.



  • Wie gehst du denn ins Internet? Direkt per DFÜ, oder über einen Router o.ä.?

    http://www.marian-aldenhoevel.de/dojo/internet.html



  • lol. na besten dank. also gibt es keine ultimative lösung dafür ja?
    und wie löst man dann sowas am geschicktesten?
    wäre es möglich erst RasConnectionNotification() zu benutzten, und wenn dies
    fehlschlägt, davon auszugehen das der rechner über LAN ins internet geht und
    dementsprechend den ping benutzen oder am besten sein lassen, bzw. immer bei programmstart eine verbindung (vom user) herstellen zu lassen???

    die geschichte wer im übrigen echt gut. muß ich gleich bookmarken 🙂
    thx

    -edit: achja ich geh per dsl mit dfü ins internet



  • Wie sieht denn dein Code aus?



  • der sieht so aus:

    #define RASCN_Connection 0x00000001
    
    #include <ras.h>
    
    class ConnectionNotify {
          public:
    
                 ConnectionNotify() {
                     SecAtt.nLength = sizeof(SECURITY_ATTRIBUTES);
                     SecAtt.lpSecurityDescriptor = NULL;
                     SecAtt.bInheritHandle = FALSE;
                     hActive = CreateEvent(&SecAtt, TRUE, FALSE, "Connect");
                     hInst = LoadLibrary("rasapi32.dll");
                 }
    
                 // prüft ob verbindung besteht
                 bool verbindung() {
                      RasNotify = (DWORD (WINAPI *)(HRASCONN, HANDLE, DWORD)) GetProcAddress ((HMODULE) hInst, "RasConnectionNotificationA");
                      DWORD ret = RasNotify((HRASCONN)INVALID_HANDLE_VALUE, hActive, RASCN_Connection);
                      if(ret == 0) {
                             WaitForSingleObject(hActive, INFINITE);
                             return true;
                      }
                      else return false;
                 }
    
                 ~ConnectionNotify() {
                     CloseHandle(hActive);
                     CloseHandle(hInst);                 
                 }
    
          private:
                  DWORD (WINAPI *RasNotify)(HRASCONN, HANDLE, DWORD);
                  SECURITY_ATTRIBUTES SecAtt;
                  HANDLE hActive;
                  HANDLE hInst;
    };
    

    also das benutzerprogramm soll die methode verbindung() aufrufen um zu sehen ob eine verbindung ins internet besteht...

    thx



  • Du hast die Funktion und auch WaitForSingleObject etwas missverstanden. RasConnectionNotification informiert dich nur, wenn sich was an der Verbindung ändert (z.B. Auf- oder Abbau) - und WaitForSingleObject (so wie du es verwendest - INFINITE) legt deinen Thread so lange schlafen, bis das Event-Handle wirklich signalisiert wird.

    Vielleicht findest du ja hier noch was passendes:
    - http://msdn.microsoft.com/library/en-us/wininet/wininet/internetgetconnectedstate.asp
    - http://msdn.microsoft.com/library/en-us/wininet/wininet/enabling_internet_functionality.asp



  • vielen dank erstmal!! 🙂

    ich werd die obigen links mal probieren.
    das mit InternetGetConnectedState hört sich ja gut an (auch wenn der "meister" das sicher anderer meinung wäre 😉 und sein schüler da wieder steine haken müßte 😃 ) wenns nich funzt meld ich mich wieder

    der obige code ist so verwurzelt weil ich in von der website genommen hab die ich oben angegeben hab. wollte es halt testen...

    thx nochmal! 🙂 👍



  • @flenders:

    ich hab jetzt noch mal folgende möglichkeit (welche ich grade teste)

    ich prüfe mit internetgetconnectionstate ober der rechner auf lan eingestellt ist.
    wenn ja, ok internetverbindung verfügbar
    wenn nein prüfe ich alle ips des rechners ob diese möglicherweise private ips
    sind.
    wenn alle private sind, hat der rechner kein internet/ist nicht verbunden
    wenn auch nur eine nicht privat ist, ist er gerade online

    das kostet zwar etwas zeit und cpu aber es funzt doch oder? 😕
    zumindest waren meine tests sehr vielversprechend...

    ich hoffe ich hab da keinen denkfehler.
    ansonsten wäre dieser thread nicht mal was für die faq??

    ciao



  • na gut jedesmal im worst case 16843002 ip adressen zu testen (und das für jede ip des rechners) ist wohl auch nicht der hit.
    ich glaube der meister hatte recht 🙄
    son mist 😞



  • so. dies ist jetzt mein definitiv letztes posting zu dem thema.
    ich habe nach dem prinzip wie oben beschrieben (private ips) folgenden code entwickelt, der für meine zwecke absolut perfekt ist.

    /** Ermittelt Hostnamen und alle IPs des Rechners und gibt diese als String zurück */
    std::string GibAlleIPs() {
        WORD wVersionRequested;
        WSADATA wsaData;
        char name[255];
        int n;
        PHOSTENT hostinfo;
        wVersionRequested=MAKEWORD(2,2);
        char *ip;
        std::string s="";
    
        if (WSAStartup(wVersionRequested,&wsaData)==0) {
            if (gethostname(name,sizeof(name))==0) {
                std::string tmp=name;
                s="\r\nHostname: "+tmp+"\r\nIPs:";
    
                if ((hostinfo=gethostbyname(name))!=NULL) {
                    for (n=0; hostinfo->h_addr_list[n];n++) {
                        ip=inet_ntoa(*(struct in_addr *)hostinfo->h_addr_list[n]);
                        s=s+" "+ip;
                    }
                }
            }
        }
        else WSACleanup();
    
        return s;
    }
    
    /* Ermittelt ob eine Internetverbindung besteht. */
    bool HatInternetVerbindung() {
    
         DWORD status; 
         bool ergebnis=InternetGetConnectedState(&status,0);
         if (ergebnis==true) if (status==INTERNET_CONNECTION_LAN) return true;
    
         std::string ipliste=GibAlleIPs();
         int pos;
         pos=ipliste.rfind(":");
         ipliste=ipliste.substr(pos+2,ipliste.length());
    
         int anzahlips=0;
         int anzahllanips=0;     
         char tmp[4];     
         bool gefunden=false;
         std::string ip="";
         std::string testip="";
         while ((pos=ipliste.find(" "))>0) {
               gefunden=false;
               ip=ipliste.substr(0,pos);
               ipliste=ipliste.substr(pos+1,ipliste.length());
               anzahlips++;
    
               // 127.0.0.0 - 127.0.0.255
               pos=ip.rfind(".");
               ip=ip.substr(0,pos);
               testip="127.0.0";
               if (ip==testip) return false;
    
               // 192.168.0.0 - 192.168.255.255           
               pos=ip.rfind(".");
               ip=ip.substr(0,pos);           
               testip="192.168";
               if (ip==testip) {
                  anzahllanips++;
                  gefunden=true;
               }
    
               // 172.16.0.0 - 172.31.255.255
               if (!gefunden) 
                  for (int i=16; i<=31; i++) {
                      testip="172.";
                      itoa(i,tmp,10);
                      testip.append(tmp);
                      if (ip==testip) {
                         anzahllanips++;
                         i=32;
                         gefunden=true;
                      }
                  }
    
               // 10.0.0.0 - 10.255.255.255
               if (!gefunden) {
                  pos=ip.rfind(".");
                  ip=ip.substr(0,pos);           
                  testip="10";
                  if (ip==testip) {
                     anzahllanips++;
                  }              
               }
         }
    
         // Letzte IP testen
         gefunden=false;     
         ip=ipliste;     
         anzahlips++;
    
         // 127.0.0.0 - 127.0.0.255
         pos=ip.rfind(".");
         ip=ip.substr(0,pos);
         testip="127.0.0";
         if (ip==testip) return false;
    
         // 192.168.0.0 - 192.168.255.255           
         pos=ip.rfind(".");
         ip=ip.substr(0,pos);           
         testip="192.168";
         if (ip==testip) {
           anzahllanips++;
           gefunden=true;
         }
    
         // 172.16.0.0 - 172.31.255.255
         if (!gefunden) 
           for (int i=16; i<=31; i++) {
               testip="172.";
               itoa(i,tmp,10);
               testip.append(tmp);
               if (ip==testip) {
                  anzahllanips++;
                  i=32;
                  gefunden=true;
               }
           }
    
         // 10.0.0.0 - 10.255.255.255
         if (!gefunden) {
           pos=ip.rfind(".");
           ip=ip.substr(0,pos);           
           testip="10";
           if (ip==testip) anzahllanips++;
         }
    
         if (anzahllanips==anzahlips) return false;
         else return true;
    }
    

    juhu! 😋


Anmelden zum Antworten