📄 rasdial.cpp
字号:
// Module Name: RasDial.cpp
//
// Description:
//
// This sample demonstrates how to develop a RAS application that is
// capable of forming RAS connections to a remote server by using the
// RasDial API. The sample uses RasDial in the asynchronous operating
// mode which is the preferred mode of establishing RAS connections
// because you can monitor connection activities as they occur in the
// RasDial API.
//
// Compile:
//
// cl -o RasDial RasDial.cpp ras32.lib
//
// Command Line Options:
//
// RasDial.exe -e [entry name] -p [phone number] -u [username] -z [password] -d [domain]
//
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <windows.h>
#include <ras.h>
#include <raserror.h>
#include <string.h>
#include <winbase.h>
#include <time.h>
#include <stdlib.h>
void WINAPI RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError);
HANDLE gTerminalEvent;
// Usage
void Usage(char *progname)
{
fprintf(stderr, "Usage\n%s \t-e [entry name] -p [phone number] "
"\n\t\t-u [username] -z [password] -d [domain]\n", progname);
exit(0);
}
void main(int argc, char*argv[])
{
RASDIALPARAMS RasDialParams;
RASCONNSTATUS RasConnStatus;
HRASCONN hRasConn;
DWORD Ret;
DWORD tcLast;
INT i;
// Create the event that indicates a terminal state
if ((gTerminalEvent = CreateEvent(NULL, FALSE, FALSE, NULL)) == NULL)
{
printf("CreateEvent failed with error %d\n", GetLastError());
return;
}
RasDialParams.dwSize = sizeof(RASDIALPARAMS);
lstrcpy(RasDialParams.szEntryName, "");
lstrcpy(RasDialParams.szPhoneNumber, "");
lstrcpy(RasDialParams.szUserName, "");
lstrcpy(RasDialParams.szPassword, "");
lstrcpy(RasDialParams.szDomain, "");
// Copy command line arguments into the RASDIALPARAMS structure
if (argc >1)
{
for(i=1;i <argc;i++)
{
if ((argv[i][0] == '-') || (argv[i][0] == '/'))
{
switch(tolower(argv[i][1]))
{
case 'e': // Entry name
lstrcpy(RasDialParams.szEntryName, argv[++i]);
break;
case 'p': // Phone number
lstrcpy(RasDialParams.szPhoneNumber, argv[++i]);
break;
case 'u': // User name
lstrcpy(RasDialParams.szUserName, argv[++i]);
break;
case 'z': // Password
lstrcpy(RasDialParams.szPassword, argv[++i]);
break;
case 'd': // Domain name
lstrcpy(RasDialParams.szDomain, argv[++i]);
break;
default:
Usage(argv[0]);
break;
}
}
else
Usage(argv[0]);
}
}
else
Usage(argv[0]);
// Dial out asynchronously using RasDial()
printf("Dialing... %s\n", RasDialParams.szPhoneNumber);
hRasConn = NULL;
if (Ret = RasDial(NULL, NULL, &RasDialParams, 0, &RasDialFunc, &hRasConn))
{
printf("RasDial failed with error %d\n", Ret);
return;
}
// Wait for RasDial to complete or enter a paused state
Ret = WaitForSingleObject(gTerminalEvent, 50000);
switch(Ret)
{
case WAIT_TIMEOUT:
// RasDial timed out
printf("RasDial Timed out...\n");
case WAIT_OBJECT_0:
// Normal completion or Ras Error encountered
printf("Will hang up in 5 seconds...\n");
Sleep(5000);
printf("Calling RasHangUp...\n");
if (Ret = RasHangUp(hRasConn))
{
printf("RasHangUp failed with error %d\n", Ret);
return;
}
RasConnStatus.dwSize = sizeof(RASCONNSTATUS);
tcLast = GetTickCount() + 10000;
while((RasGetConnectStatus(hRasConn, &RasConnStatus)
!= ERROR_INVALID_HANDLE) && (tcLast > GetTickCount()))
{
Sleep(50);
}
printf("Connection to %s terminated.\n", RasDialParams.szPhoneNumber);
break;
}
}
// 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);
printf("Error: %d - %s\n",dwError, szRasString);
SetEvent(gTerminalEvent);
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:
printf ("Opening port...\n");
break;
case RASCS_PortOpened:
printf ("Port opened.\n");
break;
case RASCS_ConnectDevice:
printf ("Connecting device...\n");
break;
case RASCS_DeviceConnected:
printf ("Device connected.\n");
break;
case RASCS_AllDevicesConnected:
printf ("All devices connected.\n");
break;
case RASCS_Authenticate:
printf ("Authenticating...\n");
break;
case RASCS_AuthNotify:
printf ("Authentication notify.\n");
break;
case RASCS_AuthRetry:
printf ("Retrying authentication...\n");
break;
case RASCS_AuthCallback:
printf ("Authentication callback...\n");
break;
case RASCS_AuthChangePassword:
printf ("Change password...\n");
break;
case RASCS_AuthProject:
printf ("Projection phase started...\n");
break;
case RASCS_AuthLinkSpeed:
printf ("Negotiating speed...\n");
break;
case RASCS_AuthAck:
printf ("Authentication acknowledge...\n");
break;
case RASCS_ReAuthenticate:
printf ("Retrying Authentication...\n");
break;
case RASCS_Authenticated:
printf ("Authentication complete.\n");
break;
case RASCS_PrepareForCallback:
printf ("Preparing for callback...\n");
break;
case RASCS_WaitForModemReset:
printf ("Waiting for modem reset...\n");
break;
case RASCS_WaitForCallback:
printf ("Waiting for callback...\n");
break;
case RASCS_Projected:
printf ("Projection completed.\n");
break;
#if (WINVER >= 0x400)
case RASCS_StartAuthentication:
printf ("Starting authentication...\n");
break;
case RASCS_CallbackComplete:
printf ("Callback complete.\n");
break;
case RASCS_LogonNetwork:
printf ("Logon to the network.\n");
break;
#endif
case RASCS_SubEntryConnected:
printf ("Subentry connected.\n");
break;
case RASCS_SubEntryDisconnected:
printf ("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:
printf ("Connection completed.\n");
SetEvent(gTerminalEvent);
break;
case RASCS_Disconnected:
printf ("Disconnecting...\n");
SetEvent(gTerminalEvent);
break;
default:
printf ("Unknown Status = %d\n", rasconnstate);
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -