Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » FAQ VC++ / MFC » Internetverbindung über Ras herstellen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
18.01.2003, 16:38 Uhr
Uwe
C/C++ Master
(Administrator)


Autor U. Fröhlich

Ein häufig im Forum gestellt Frage ist: "Wie kann ich eine Verbindung zum Internet herstellen?". Dafür bieten sich verschiedene Möglichkeiten an. Ich denke hier an die in VC++ integrierte Unterstützung von WinInet. Dies bietet die relativ einfache Möglichkeit über die Klasse CInternetSession per HTTP auf das Internet zuzugreifen. Weiterhin erhält man über die Klasse CFtpConnection Zugriff auf das Internet via FTP. Diese beiden Klassen haben aber einige Nachteile. Ein Beispiel dafür ist, dass eine bestehende Verbindung nach Aufruf von Close(); nicht automatisch getrennt wird. Diesen Mangel beseitigen wir indem wir zum Verbindungsauf- und Abbau die RAS-API nutzen. Folgendes wird vorraus gesetzt:

1. Die rasapi32.dll muß auf dem System vorhanden sein, dies ist automatisch
der Fall, wenn das DFÜ-Netzwerk installiert ist und eine Verbindung
eingerichtet ist.
2. Der "ras.h" Header sowie für die Fehlerbehandlung der "raserror.h"
Header sind im Projekt zu includieren.
3. Die rasapi32.lib ist bei den Projekteinstellungen mit zu linken.

Wir benötigen nun nur noch den Zugriff auf die bestehenden Verbindungen, welche über das DFÜ-Netzwerk aufgebaut wurden. Dafür nutzen wir die Funktion RasEnumConnections(). Der Rest ist eigentlich nur noch ein "Spiel". So nun genug der Theorie. Hier etwas Code, damit es nicht zu langweilg wird. Das Projekt baut sich wie folgt auf:
-Format: Dialoganwendung
-3 Eingabefelder : IDC_USER
IDC_PW
IDC_PHONENUMBER
-3 Membervariable für die Felder: m_strNutzer
m_strPW
m_strNummer
-2 Button : IDC_CONNECT
IDC_DISCONNECT

In der Dialogklasse werden zwei Memberfunktionen hinzugefügt:
1. Funktion
Funktionstyp : bool
Funktionsdeklaration: Verbinden()
Zugriffsstatus : protected

2. Funktion
Funktionstyp : bool
Funktionsdeklaration: Trennen()
Zugriffsstatus : protected

Diese Funktionen füllen wir wie folgt:

C++:
bool CVerbindungDlg::Verbinden()
{
        RASDIALPARAMS rasPara;
        rasPara.dwSize = sizeof(RASDIALPARAMS);
        rasPara.szEntryName[0] = '\0';
        lstrcpy( rasPara.szPhoneNumber, m_strNummer );
        rasPara.szCallbackNumber[0] = '\0';
        lstrcpy( rasPara.szUserName, m_strNutzer );
        lstrcpy( rasPara.szPassword, m_strPW );
        rasPara.szDomain[0] = '\0';

        HRASCONN hRasVerb = NULL;
        DWORD dwReturn = RasDial( NULL, NULL, &rasPara, 0L, NULL, &hRasVerb );
        if ( dwReturn == 0 )
                return true;
        char  szBuf[256];
        if ( RasGetErrorString( (UINT)dwReturn, (LPSTR)szBuf, 256 ) != 0 )
                wsprintf( (LPSTR)szBuf, "Unbehandelter RAS Fehler (%ld).", dwReturn );
        RasHangUp( hRasVerb );
        MessageBox( (LPSTR)szBuf, "Fehler", MB_OK | MB_ICONSTOP );
        return FALSE;
}

und nun noch das Trennen der Verbindung

C++:
bool CVerbindungDlg::Trennen()
{
        RASCONN Ras[20];
        DWORD  dSize, dNummer;
        char  szBuf[256];

        Ras[0].dwSize = sizeof( RASCONN );
        dSize = sizeof( Ras );
        DWORD  dwReturn = RasEnumConnections( Ras, &dSize, &dNummer );// Active RAS - Verbindung holen
        if ( dwReturn != 0 )
        {
                if ( RasGetErrorString( (UINT)dwReturn, (LPSTR)szBuf, 256 ) != 0 )
                        wsprintf( (LPSTR)szBuf, "Unbehandelter RAS Fehler (%ld).", dwReturn );
                MessageBox( (LPSTR)szBuf, "Trennen", MB_OK | MB_ICONSTOP );
                return FALSE;
        }
        bool bOK = TRUE;
        for( DWORD dZaehler = 0;  dZaehler < dNummer;  dZaehler++ )
        {
                HRASCONN hRasVerb = Ras[dZaehler].hrasconn;
                DWORD dwReturn = RasHangUp( hRasVerb );//Verbindung beenden
                if ( dwReturn != 0 )
                {
                        char  szBuf[256];
                        if ( RasGetErrorString( (UINT)dwReturn, (LPSTR)szBuf, 256 ) != 0 )
                                wsprintf( (LPSTR)szBuf, "Unbehandelter RAS Fehler (%ld).", dwReturn );
                        MessageBox( (LPSTR)szBuf, "Trennen", MB_OK | MB_ICONSTOP );
                        bOK = FALSE;
                }
        }
        return bOK;
}

Das gesamte Projekt kann über Downloadbereichzum besseren Verständnis geladen werden.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ FAQ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: