实现网络的远程访问服务

发表于:2007-07-04来源:作者:点击数: 标签:
苏水荣 在现代复杂的大型计算机 网络 环境中,一台计算机常常需要通过电话线路登录到可能远在数千公里外的远程网络上,以取得网络资源,或与网络中的其它计算机进行通讯(拨号上Internet就是其中一例)。在设计有这样 需求 的网络程序时,我们应当为其集成远
苏水荣

  在现代复杂的大型计算机网络环境中,一台计算机常常需要通过电话线路登录到可能远在数千公里外的远程网络上,以取得网络资源,或与网络中的其它计算机进行通讯(拨号上Internet就是其中一例)。在设计有这样需求的网络程序时,我们应当为其集成远程访问服务(RAS,Remote Aclearcase/" target="_blank" >ccess Service)能力,以使我们的程序的功能上更完整,结构上更严谨。

  为了方便程序员编写RAS程序,Microsoft提供了一套完整的前缀为Ras-的Windows API函数以供调用。这些函数提供拨号登录网络、检测连接状态、返回错误、断开连接等功能。在拨号登录时,我们还要填写一个RASDIALPARAMS结构(在代码说明时会有更详细的说明),以提供足够的登录信息。

  我们利用VC++向导创建一个基于对话框的Project,命名为RASDemo,修改主对话框样式如图1。下面列出主对话框CRASDemoDlg类的主要代码:


  图1

  #include 〈ras.h〉

  #include 〈raserror.h〉

  #pragma comment(lib, "rasapi32.lib")

  BOOL CONNECTION;

  //定义一组全局变量

  HRASCONN RasConn; //RAS的连接句柄

  BOOL bConnected;

  //连接是否成功标志

  DWORD m_Error;

  //错误标志

……//省略部分代码

  void CRASDemoDlg::OnConnect() //这个函数响应连接按钮的单击消息

  {

  //变量CONNECTION已被初始化为TRUE

if(CONNECTION==TRUE)

  //若处于脱机状态,则进行连接操作

{ Connect(); //连接 }

else DisConnect(); //若处于连接状态,则进行断开连接操作 }

  void CRASDemoDlg::Connect()

  //该函数进行拨号连接登录网络的操作

  { RASDIALPARAMS DialParams;

CString DomainName;

  //待登录的服务器

CString PhoneCall; //拔叫电话号码

CString LoginName;//账号

CString Password;//密码

CONNECTION=FALSE;

m_Connection.SetWindowText("断开"); //设置按钮“连接”(或“断开”)上的文字

m_Domain.GetWindowText(DomainName);// “主机名”编辑框的对应控制

m_Account.GetWindowText(LoginName);// “账号”编辑框的对应控制

m_Password.GetWindowText(Password);// “密码”编辑框的对应控制

m_PhoneCall.GetWindowText(PhoneCall);

//下面开始填写RASDIALPARAMS结构,以提供足够的登录信息

DialParams.dwSize=sizeof(DialParams);//域dwSize标示其结束的大小

strcpy(DialParams.szEntryName,"");

strcpy(DialParams.szPhoneNumber,PhoneCall);

strcpy(DialParams.szUserName,LoginName);

  //域szUserName标示登录账号

strcpy(DialParams.szPassword,Password);

  //域szPassword标示登录密码

strcpy(DialParams.szDomain,DomainName);

  //域szDomain标示登录主机地址

  DWORD ErrorCode=RasDial(NULL,NULL,&&DialParams,0, //拨号登录

   RasCallBack,&&RasConn);//回调函数RasCallBack处理拨号中的消息

while(bConnected= =FALSE)

  //显示拨号状态直至拨号成功

{ //进入消息循环,处理拨号过程中所发生的消息

  MSG msg;

  if(::PeekMessage(&&msg,NULL,0,0,PM_REMOVE))

  { ::TranslateMessage(&&msg);

::DispatchMessage(&&msg); }

  CString Status=GetRasStatus(); //取得拨号过程中的状态消息

  m_Status.SetWindowText(Status); //显示状态信息

  ::Sleep(100); //延时

  if(m_Error!=0) //若拨号过程中发生错误,则断开连接

  { RasGetErrorString(m_Error,Status.GetBuffer(256),256);

  m_Status.SetWindowText(Status);

  ::MessageBox(this-〉m_hWnd,Status,"Error",MB_OK);

  DisConnect();

  return ; } } }

  void WINAPI RasCallBack(UINT uMsg,RASCONNSTATE rasConnState, DWORD dwError)

  { if(dwError)//若dwError非零,表示拨号过程中产生错误

{ m_Error=dwError; }

else if (RASCS_DONE&&rasConnState) //若rasConnState为RASCS_DONE,登录成功

{ bConnected=TRUE; } }

  void CRASDemoDlg::DisConnect() //函数用于断开RAS连接

  { if(RasConn)

{ CONNECTION=TRUE;

m_Connection.SetWindowText("连接");

RasHangUp(RasConn); //断开RAS连接

RasConn=NULL;

m_Status.SetWindowText("离线"); } }

  CString CRASDemoDlg::GetRasStatus() //函数取得当前连接的状态并返回其相应消息

  { DWORD dw;

RASCONNSTATUS m_rasStatus;

CString strStatus;

bConnected = FALSE;

memset(&&m_rasStatus, 0, sizeof(m_rasStatus));

m_rasStatus.dwSize = sizeof(m_rasStatus);

dw = RasGetConnectStatus(RasConn, &&m_rasStatus); //取得当前RAS连接的状态

switch(m_rasStatus.rasconnstate)

{ //由于状态消息的处理很相似,这里只列出三个状态,其余状态请自行编写

  case RASCS_Connected:

  strStatus = "连接至远程主机成功!\n""请稍候...";

bConnected = TRUE;

break;

case RASCS_ConnectDevice:

strStatus = "正在连接...";

break;

case RASCS_Authenticate:

strStatus = "正在校验账号与密码...";

break; }

return strStatus; }

编译连接后,便可以得到一个通过拨号登录远程网络的范例程序。

以上程序在VC++6.0下编译,中/英文Window98下运行正常。   

原文转自:http://www.ltesting.net