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; 
}