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 |