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.ä.?
-
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 wiederder obige code ist so verwurzelt weil ich in von der website genommen hab die ich oben angegeben hab. wollte es halt testen...
thx nochmal!

-
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 onlinedas 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!
