C++ Internetverbindung überprüfen

Pyroluk

Lt. Junior Grade
Registriert
Jan. 2008
Beiträge
265
Hallo,

ich benutze CodeBlocks als IDE und den GNU GCC Compiler.

Wenn ich den Code compilieren will kommt die Fehlermeldung:

|16| undefined reference to `_InternetGetConnectedState@8'

Ich verstehe nicht wo das Problem liegt :(


Code:
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <Wininet.h>

using namespace std;

int main()
{
    char nochmehr;
    do{

        bool internet;
        DWORD dwFlags;

        internet = InternetGetConnectedState(&dwFlags, 0);

        if(internet == true)
        {
            cout << "du hast Internet\n";
        }
        else
        {
            cout << "du hast kein Internet !\n";
        }

        cout << "willst du nochmehr wissen?\n";
        nochmehr = getch();
        system("cls");


    }while(nochmehr == 'j');
    return 0;
}

evtl kann mir auch jemand erklären was DWORD ist/heißt
 
Hi,

du musst dem Linker noch die Bibliothek mitteilen, in der die Funktion InternetGetConnectedState definiert ist. Diese gehört zur Win32 API und ist bei gcc in libwininet.a implementiert.

Der Aufruf sieht dann so aus:

gcc -o prog program.c -lwininet

(Erstellt prog.exe aus program.c und bindet die Datei libwininet.a beim Linken mit ein.)

DWORD ist in Win32 ein unsigned int.
 
Ah ok

ich werd gleich alles Probieren, ich melde mich nachher obs geklappt hat


Edit:

JUHU durch hinzufügen der libwininet.a Lib tuts jetzt :)

Danke für eure Hilfe!

eine Frage noch was speichert man in so ein DWORD?
 
Zuletzt bearbeitet:
Pyroluk schrieb:
eine Frage noch was speichert man in so ein DWORD?

Zahlen. So wie jeder Datentyp.
Der Datentyp Word variiert sich, auf welcher Maschine man arbeitet.
Auf einer 16-Bit Maschine ist Word 16 Bit groß.
Auf einer 32-Bit Maschine ist Word 32 Bit groß.
Aber ob Word 64 Bit auf einer 64-Bit Maschine groß ist, das weiß ich gar nicht.

DWord heißt Double Word. Also doppelt so groß, wie ein Word.
 
Verdammt

Verdammt, es funktioniert nicht zuverlässig

das Prog soll im Hintergrund auf einem Windows Server laufen und einen TrueCrypt Container unmounten, wenn keine Internetverbindung besteht
(also wenn ich keinen Zugriff auf den Server habe)

Nun hab ich es an meinem PC getestet -> Das Prog läuft und schreibt alle 2sec "Du hast Internet (nur zum Testen)
Wenn ich dann das Lan Kabel ziehe schreibt er immer noch "Du hast Internet" :mad:

Selbst wenn ich das Programm schließe und wieder starte sacht er immer noch "Du hast Internet" :freak:

Wie kann das denn sein !?


Code:
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <Wininet.h>

using namespace std;

bool nochmehr = true;

void Internet(void);

int main()
{
    /*SetConsoleTitle("internet");
    Sleep(20);
    HWND hMeinFenster = FindWindow(NULL, "internet");
    ShowWindow(hMeinFenster, SW_HIDE);*/

    do{

        Internet();

    }while(nochmehr == true);
    return 0;
}

void Internet(void)
{
        bool internet;
        DWORD dwFlags;
        internet = false;
        internet = InternetGetConnectedState(&dwFlags, 0);

        if(internet == false)
        {
            system("truecrypt.exe /d /f /w /q");
            cout << "\n\nDu hast kein Internet\n";
            nochmehr = false;
        }
        else
        {
            cout << "Du hast internet\n";
        }

        Sleep(2000);
}
 
Auf einer 16-Bit Maschine ist Word 16 Bit groß.
Auf einer 32-Bit Maschine ist Word 32 Bit groß.
Aber ob Word 64 Bit auf einer 64-Bit Maschine groß ist, das weiß ich gar nicht.

Das ist mit großer Vorsicht zu genießen, weil man leider nicht davon ausgehen kann was gemeint ist. Normalerweise hast du recht, aber Microsoft hat z.B. definiert das der Typ WORD als 16 Bit und DWORD als 32 Bit definiert ist, Plattformunabhängig.
 
Hallo,

ist es nicht möglich, eine beliebige Seite anzupingen und auf eine Antwort zu warten?
 
Achso!

ok werd das nachher umschreiben und den Code posten
 
ActiveO2 schrieb:
Hallo,

ist es nicht möglich, eine beliebige Seite anzupingen und auf eine Antwort zu warten?

Natürlich ist das möglich. Nur - woher will man wissen, dass die Antwort wirklich aus "dem" Internet kommt? DNS kann man einrichten wie man will. Möglicherweise ist man ja im "Internet", aber dieser Server ist gerade down oder eine Route dorthin. Oder aber man ist im Internet, aber der Dienst, den man haben will, ist trotzdem nicht erreichbar aufgrund von ca. 1001 Grund und man glaubt, man wäre garnicht im "Internet". Außerdem gibt man mit so einer Anfrage immer ein Stück eigenes Verhalten preis. So weiß die Gegenseite z.B. ob man online ist.

Natürlich ist das Benutzen so einer Funktion immernoch relativ praxisnah, keine Frage. Trotzdem weiß man es eigentlich nicht, ob man mit "dem" Internet verbunden ist und falls ja, ob einem das überhaupt etwas bringt aufgrund von Erreichbarkeit von Diensten. Deshalb musste ich einfach etwas schmunzeln und wollte die Geschichte einfach mal zum Besten geben (über das Linux vs. Windows motivierte Gedöns ebenso einfach mit einem Schmunzeln drüber wegsehen, aber ist es inhaltlich trotzdem richtig).

Aber was sollte man eigentlich tun? Warum nicht einfach versuchen, den Dienst zu erreichen, den man haben will und fertig? Ansonsten kann man auch versuchen, mit Zertifikaten o.ä. sicherzustellen, dass der gewünschte Dienst tatsächlich der ist, für den er sich ausgibt und damit höchstwahrscheinlich im "Internet" steht.

Edit:
Und bitte nicht als Zerreißen des Themas oder Klugschei*en verstehen, sondern einfach als kleinen Denkanstoß. :)
 
Zuletzt bearbeitet:
Whiz-zarD schrieb:
Zahlen. So wie jeder Datentyp.
Der Datentyp Word variiert sich, auf welcher Maschine man arbeitet.
Auf einer 16-Bit Maschine ist Word 16 Bit groß.
Auf einer 32-Bit Maschine ist Word 32 Bit groß.
Aber ob Word 64 Bit auf einer 64-Bit Maschine groß ist, das weiß ich gar nicht.

DWord heißt Double Word. Also doppelt so groß, wie ein Word.


Nein das stimmt so nicht !
Word hat immer 2Byte und als der Register auf 32Bit erweitert wurde hat man dann 4Bytes DWord genannt und bei 8Bytes sind dann LWord.
 
:heul: InternetCheckConnection gibt immer false zurück :confused_alt:

Ich hab schon einiges probiert, wie man an den Kommentaren sehen kann :rolleyes:

So schwer kann das doch nicht sein :heul:

Code:
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <Wininet.h>

using namespace std;

bool nochmehr = true;

void Internet(void);

int main()
{
    /*SetConsoleTitle("internet");
    Sleep(20);
    HWND hMeinFenster = FindWindow(NULL, "internet");
    ShowWindow(hMeinFenster, SW_HIDE);*/

    do{

        Internet();

    }while(nochmehr == true);
    return 0;
}

void Internet(void)
{
        //bool internet;
       // DWORD dwFlags = 'FLAG_ICC_FORCE_CONNECTION';
        LPCTSTR lpszUrl = "www.google.de";

        //internet = false;
        //internet = InternetCheckConnection(lpszUrl, 0, 0);

        //if(InternetCheckConnection(lpszUrl, 0, 0) == false)
        if (!InternetCheckConnection( lpszUrl, NULL, NULL ) )
        {
            //system("truecrypt.exe /d /f /w /q");
            cout << "\n\nDu hast kein Internet\n";
            //nochmehr = false;
            cout << GetLastError() << endl << lpszUrl;
        }
        else
        {
            cout << "Du hast internet\n";
        }

        Sleep(2000);
}
 
Zurück
Oben