www.pudn.com > VPNClient-Source.rar > RasDial.cpp
#include "StdAfx.h"
#include "resource.h"
#include "RasDial.h"
HANDLE g_TerminalEvent;
//output the debug infor into log file & DbgPrint
void OutputString( char *lpFmt, ... )
{
char buff[1024];
va_list arglist;
va_start( arglist, lpFmt );
_vsnprintf( buff, sizeof buff, lpFmt, arglist );
va_end( arglist );
AfxGetMainWnd()->GetDlgItem(IDC_STATUS)->SetWindowText(buff);
CListCtrl *pListCtrl = (CListCtrl *)AfxGetMainWnd()->GetDlgItem(IDC_LIST);
int nItem = pListCtrl->GetSelectionMark();
if (nItem != -1)
{
pListCtrl->SetItemText(nItem, 4, buff);
return;
}
OutputDebugString(buff);
}
BOOL CreateRasEntry(const char *pszEntryName, const char *pszServerName, const char *pszUserName,
const char *pszPassWord)
{
RASENTRY rasEntry;
DWORD rasEntrySize, dwResult;
rasEntrySize = sizeof(rasEntry);
memset(&rasEntry, 0, sizeof(rasEntry));
rasEntry.dwType = RASET_Vpn;
rasEntry.dwRedialCount = 30000;
rasEntry.dwRedialPause = 1;
rasEntry.dwSize = sizeof(rasEntry);
rasEntry.dwfOptions = RASEO_RequireMsEncryptedPw | RASEO_RequireDataEncryption | RASEO_ModemLights | RASEO_ShowDialingProgress;
lstrcpy(rasEntry.szLocalPhoneNumber, pszServerName);
lstrcpy(rasEntry.szDeviceType, RASDT_Vpn);
lstrcpy(rasEntry.szDeviceName, TEXT("RAS VPN Line 0"));
dwResult = RasSetEntryProperties(NULL, pszEntryName, &rasEntry, sizeof(rasEntry), NULL, 0);
if (dwResult != 0)
{
OutputString("RasSetEntryProperties %s failed error=%d\n", pszEntryName, dwResult);
return FALSE;
}
RASDIALPARAMS rdParams;
ZeroMemory(&rdParams, sizeof(RASDIALPARAMS));
rdParams.dwSize = sizeof(RASDIALPARAMS);
lstrcpy(rdParams.szEntryName, pszEntryName);
lstrcpy(rdParams.szUserName, pszUserName);
lstrcpy(rdParams.szPassword, pszPassWord);
DWORD dwRet = RasSetEntryDialParams(NULL, &rdParams, FALSE);
if(dwRet == 0)
return TRUE;
else
return FALSE;
}
// Callback function RasDialFunc()
void WINAPI RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)
{
char szRasString[256]; // Buffer for storing the error string
if (dwError) // Error occurred
{
RasGetErrorString((UINT)dwError, szRasString, 256);
OutputString("Error: %d - %s\n",dwError, szRasString);
SetEvent(g_TerminalEvent);
return;
}
// Map each of the states of RasDial() and display on the screen
// the next state that RasDial() is entering
switch (rasconnstate)
{
// Running States
case RASCS_OpenPort:
OutputString ("Opening port...\n");
break;
case RASCS_PortOpened:
OutputString ("Port opened.\n");
break;
case RASCS_ConnectDevice:
OutputString ("Connecting device...\n");
break;
case RASCS_DeviceConnected:
OutputString ("Device connected.\n");
break;
case RASCS_AllDevicesConnected:
OutputString ("All devices connected.\n");
break;
case RASCS_Authenticate:
OutputString ("Authenticating...\n");
break;
case RASCS_AuthNotify:
OutputString ("Authentication notify.\n");
break;
case RASCS_AuthRetry:
OutputString ("Retrying authentication...\n");
break;
case RASCS_AuthCallback:
OutputString ("Authentication callback...\n");
break;
case RASCS_AuthChangePassword:
OutputString ("Change password...\n");
break;
case RASCS_AuthProject:
OutputString ("Projection phase started...\n");
break;
case RASCS_AuthLinkSpeed:
OutputString ("Negotiating speed...\n");
break;
case RASCS_AuthAck:
OutputString ("Authentication acknowledge...\n");
break;
case RASCS_ReAuthenticate:
OutputString ("Retrying Authentication...\n");
break;
case RASCS_Authenticated:
OutputString ("Authentication complete.\n");
break;
case RASCS_PrepareForCallback:
OutputString ("Preparing for callback...\n");
break;
case RASCS_WaitForModemReset:
OutputString ("Waiting for modem reset...\n");
break;
case RASCS_WaitForCallback:
OutputString ("Waiting for callback...\n");
break;
case RASCS_Projected:
OutputString ("Projection completed.\n");
break;
#if (WINVER >= 0x400)
case RASCS_StartAuthentication:
OutputString ("Starting authentication...\n");
break;
case RASCS_CallbackComplete:
OutputString ("Callback complete.\n");
break;
case RASCS_LogonNetwork:
OutputString ("Logon to the network.\n");
break;
#endif
case RASCS_SubEntryConnected:
OutputString ("Subentry connected.\n");
break;
case RASCS_SubEntryDisconnected:
OutputString ("Subentry disconnected.\n");
break;
// The RAS Paused States will not occur because
// we did not use the RASDIALEXTENSIONS structure
// to set the RDEOPT_PausedState option flag.
// The Paused States are:
// RASCS_RetryAuthentication:
// RASCS_CallbackSetByCaller:
// RASCS_PasswordExpired:
// Terminal States
case RASCS_Connected:
OutputString ("Connection completed.\n");
OutputString ("连接成功\n");
SetEvent(g_TerminalEvent);
break;
case RASCS_Disconnected:
OutputString ("Disconnecting...\n");
SetEvent(g_TerminalEvent);
break;
default:
OutputString ("Unknown Status = %d\n", rasconnstate);
break;
}
}
//BOOL ConenectVPN(VPNPARAMS VPNParams)
BOOL ConenectVPN(LPVOID lparam)
{
RASDIALPARAMS RasDialParams;
RASCONNSTATUS RasConnStatus;
HRASCONN hRasConn;
DWORD Ret;
DWORD tcLast;
INT i;
VPNPARAMS VPNParams;
memcpy(&VPNParams, lparam, sizeof(VPNPARAMS));
// Create the event that indicates a terminal state
if ((g_TerminalEvent = CreateEvent(NULL, FALSE, FALSE, NULL)) == NULL)
{
OutputString("CreateEvent failed with error %d\n", GetLastError());
return FALSE;
}
RasDialParams.dwSize = sizeof(RASDIALPARAMS);
lstrcpy(RasDialParams.szEntryName, VPNParams.szDescription);
lstrcpy(RasDialParams.szPhoneNumber, VPNParams.szServer);
lstrcpy(RasDialParams.szUserName, VPNParams.szUserName);
lstrcpy(RasDialParams.szPassword, VPNParams.szPassword);
lstrcpy(RasDialParams.szDomain, VPNParams.szDomain);
CreateRasEntry(RasDialParams.szEntryName, RasDialParams.szPhoneNumber,
RasDialParams.szUserName, RasDialParams.szPassword);
// Dial out asynchronously using RasDial()
OutputString("Dialing... %s\n", RasDialParams.szPhoneNumber);
hRasConn = NULL;
if (Ret = RasDial(NULL, NULL, &RasDialParams, 0, &RasDialFunc, &hRasConn))
{
OutputString("RasDial %s failed with error %d\n", RasDialParams.szPhoneNumber, Ret);
RasDeleteEntry(NULL, RasDialParams.szEntryName);
return FALSE;
}
// Wait for RasDial to complete or enter a paused state
Ret = WaitForSingleObject(g_TerminalEvent, 50000);
switch(Ret)
{
case WAIT_TIMEOUT:
// RasDial timed out
OutputString("RasDial Timed out...\n");
case WAIT_OBJECT_0:
// Normal completion or Ras Error encountered
WaitForSingleObject(VPNParams.hTerminalEvent, INFINITE); // 等待断开
break;
}
OutputString("Calling RasHangUp...\n");
if (Ret = RasHangUp(hRasConn))
{
OutputString("RasHangUp failed with error %d\n", Ret);
//return FALSE;
}
RasConnStatus.dwSize = sizeof(RASCONNSTATUS);
tcLast = GetTickCount() + 10000;
while((RasGetConnectStatus(hRasConn, &RasConnStatus)
!= ERROR_INVALID_HANDLE) && (tcLast > GetTickCount()))
{
Sleep(50);
}
OutputString("Connection to %s terminated.\n", RasDialParams.szPhoneNumber);
RasDeleteEntry(NULL, RasDialParams.szEntryName);
OutputString("Delete EntryName %s OK.\n", RasDialParams.szEntryName);
OutputString("已断开");
return TRUE;
}