RAS函数

RasDial概述  本函数建立RAS 客户端和服务器端的一个连接。这个连接包括和返回用户验证信息。
   函数原型:
  DWORD RasDial(
  LPRASDIALEXTENSIONS dialExtensions,
  LPTSTR phoneBookPath ,
  LPRASDIALPARAMS rasDialParam ,
  DWORD NotifierType,
  LPVOID notifier,
  LPHRASCONN pRasConn );

参数

   dialExtensions

  本参数可以被忽略并且可以设置为NULL,在Windows CE,RasDial 总是使用RASDIALEXTENSIONS 当做默认选项

            lpRasDialExtensions为RASDIALEXTENSIONS结构体变量
typedef struct tagRASDIALEXTENSIONS{
          DWORD dwSize;//必须设置为RASDIALEXTENSIONS结构体的长度(按字节)
          DWORD dwfOptions;//允许为使用RASDIAL扩展特性而设置为标志
          HWND  hwndParent;//不用,应该设置NULL字符
          ULONG_PTR reserved;//不用,应该设置0
#if(WINVER>=0x500)
          ULONG_PTR reserved1;保留 应该设置0
          RASEAPINFO RasEapInfo;//Windows 2000上,允许指定"扩展性身份验证协议"(EAP)信息
#endif
}RASDIALEXTENSIONS;

  phoneBookPath

  本参数可以被忽略并且可以设置为NULL,通过电话簿 存储进行 拨号上网注册,而不是通过电话簿文件。
   rasDialParam
  一个指向 RASDIALPARAMS 结构的指针,用来描述 RAS连接的调用参数。调用者必须设置RASDIALPARAMS 结构的 dwSize成员(即结构大小),用sizeof(RASDIALPARAMS)取得大小,防止不同版本的系统取得的大小不同
   NotifierType
  描述通告程序的参数性质。如果通告程序为NULL,本参数可以忽略,如果非空,则设置本参数为下面值:
  0xFFFFFFFF 通过程序是一个句柄,是 窗体接收通告程序消息用的。在通告程序进行中,wParam参数指示 RAS连接将要进入的连接状态。当发生错误时lParam里存储 错误信息
  通告程序处理时,使用的消息是:WM_RASDIALEVENT。
   notifier
  一个 指针,指向窗体句柄,用来接收RasDial的通告事件。如果本参数非空,RasDial为每一个通告事件发送一个windows消息。RasDial调用异步操作:在建立连接之前RasDial立即返回,使用窗体进行 进程通信
  如果本参数被设置为:NULL,RasDial 调用同步操作:RasDial不立即返回,直到连接成功或者连接失败。
  如果本参数非空,在调用RasDial之后,窗体通知会在任何时候出现。当下列事件发生时通知结束:
  连接被建立,换句话说,RAS的连接状态是RASCS_Connected
  连接失败,换句话说,dwError 非零
   RasHangUp在连接时被调用
  在RasDial最初被调用时,在 线程获取上下文时产生回调通知
   pRasConn
  一个HRASCONN类型的指针,必须设置HRASCONN 类型 变量为空在调用RasDial前。如果RasDial成功,本函数存储一个RAS连接句柄在本参数中。
  返回值:
  0表示成功。而且本函数存储一个RAS连接的句柄的指针在pRasConn中
  非0值表示错误。错误的宏定义在RAS头文件中 例如:ERROR_NOT_ENOUGH_MEMORY内存不足,在Raserror.h中定义错误的宏定义

备注:

   RASDIALPARAMS结构的szCallBackNumber和szPhoneNumber成员 被参数 rasDialParam指向 如果不适用设置为NULL
  RasDial 不会列出上网登陆对话框,RasDial通过远程网络应用使用。应用程序负责获得用户信息。
  错误产生后,通过调用RasGetConnectStatus可以立即返回错误。 可用数据直到调用 RasHangUp 函数才失效。在一个非空连接句柄被 存储到pRasConn时应用程序最终调用RasHangUp。 即使RasDial返回一个非零值,(即发生了错误),仍然要调用RasHangUp。一个应用程序能够安全的从RasDial产生的句柄调用RasHangUp。如果RasHangUp 成功了,通常程序在返回时才结束。只有在支持PostMessage函数时, 窗体基础句柄要想工作。
   必要条件:
  操作系统: Windows CE
  版本:大于等于1.0
  定义位置:Ras.h, Afdfunc.h
  预处理lib文件 Ppp.lib
   注:

  本API是微软公司提供的完整 Windows CE操作系统包的一部分。这个功能取决于原始设备制造商,有些设备可能不支持这个API。

RAS协议:
 远程访问服务(RAS)是Windows 9X/NT/2000操作系统提供的系统服务器之一,通过电话线可以使单独的计算机接入网络,或通过两个RAS对拨使两个局域网互连,此项服务的功能可以使远程的计算机以较低的费用同网络连接,而且一旦建立了RAS连接,则可以使用其它的几乎所有的网络函数,对用户来说,实际上和通过网卡在基于网中进行数据传输是一样的。
拨号和连接管理:
 1拨号函数RasDial
  DWORD RasDial(
               LPRASDIALEXTENSIONS lpRasDialExtensions,
               LPCRSTR lpszPhonebook,
               LPRASDIALPARAMS lpRasDialParams,
               DWORD dwNotifierType,
               LPVOID lpvNotifier,
               LPHRASCONN lphRasConn);
参数说明:
(1)lpRasDialExtensions为RASDIALEXTENSIONS结构体变量
typedef struct tagRASDIALEXTENSIONS{
          DWORD dwSize;//必须设置为RASDIALEXTENSIONS结构体的长度(按字节)
          DWORD dwfOptions;//允许为使用RASDIAL扩展特性而设置为标志
          HWND  hwndParent;//不用,应该设置NULL字符
          ULONG_PTR reserved;//不用,应该设置0
#if(WINVER>=0x500)
          ULONG_PTR reserved1;保留 应该设置0
          RASEAPINFO RasEapInfo;//Windows 2000上,允许指定"扩展性身份验证协议"(EAP)信息
#endif
}RASDIALEXTENSIONS;

(2)lpRasDialParams
    lpRasDialParams为结果RASDIALPARAMS变量
 typedef struct _RASDIALPARAMS
{
   DWORD dwSize;//结构体长度(按字节).有了这个标志,RAS便可以对程序使用的操作系统平台版本进行内部判断。因为不同的操作系统,这个结构体是不一样的
   TCHAR szEntryName[RAS_MaxEntryName+1];//允许标志一个电话薄条目,该条目包含在RASDIAL函数的lpszPhonebook参数列出的电话薄文件内。该参数比较重要,因为电话薄条目能够使用户更好地指定RAS连接属性。如选定一个Modem或者一个分帧协议等,但是,为了使用RasDial而指定一个电话薄条目并不是非用不可,可以选择使用。如果该字段为空,RasDial就会选择系统上安装的第一个可以使用的Modem,并依据下一个参数szPhoneNumber来拨叫连接
   TCHAR szPhoneNumber[RAS_MaxPhoneNumber+1];//代表一个电话号码,优先于szEntryName指定的电话薄条目内包含的电话号码
   TCHAR szCallbackNumber[RAS_MaxCallbackNumber+1];//允许指定一个电话号码,RAS服务器可以给据这个号码回拨,如果RAS服务器允许有一个回拨号码,他就中断原来的连接,利用指定的回拨号码回拨
这个特性非常有用,因为服务器可以知道连接的用户来自何处。
   TCHAR szUserName[UNLEN+1];//标志RAS服务器上的用户进行身份验证时所用的登陆名
   TCHAR szPassword[PWLEN+1];//标志RAS服务器上的用户进行身份验证所用的密码
   TCHAR szDomain[DNLEN+1];//可选项,指定最初的电话薄字条目拨叫一个RAS多链路连接
#if(WINVER>=0x401)
   DWORD dwSubEntry;//标志用户帐号所在的Windows 2000或者NT区域
   ULONG_PTR dwCallbackId;//允许把一个应用程序定义的值投递到一个RasDidalFunc2回拨函数中
#endif
}RASDIALPARAMS;
(3)lpszPhonebook:识别到一个电话薄文件的路径
2 断开拨号函数RasHangUp:
  DWORD RasHangUp(HRASCONN hrasconn);//hrasconn正在连接的句柄,也就是在上一个函数中的最后一个参数hRasConn所得到的值
3 获取连接状态函数RasGetConnectStatus:
DWORD RasGetConnectStatus(HRASCONN hrasconn,LPRASCONNSTATUS Iprasconnstatus);
Iprasconnstatus为一个结构体RASCONNSTATUS,它取得当前连接状态
typedef struct _RASCONNSTATUS{
 DWORD         dwSize;//结构体大小
 RASCONNSTATE rasconnstate;//一种连接状态
 DWORD         dwError;//返回值不是0,就取得具体的错误代码
 TCHAR         szDeviceType[RAS_MaxDeviceType+1];//连接所用的设备类型
 TCHAR         szDeviceName[RAS_MaxDeviceName+1];//当前设备名称
}RASCONNSTATUS
RAS的活动连接状态 有很多
连接有3种活动状态:运行,暂停,中止
 运行:RasDial调用仍在进程当中,每一处运行状态活动都将提供进程状态分析
 暂停:表示RasDial需要更多的信息来建立连接,默认设置是取消暂停状态。在RASDIALEXTENSIONS结构中设置RDEOPT_PauseStates标志,便可以启用通知进程。当连接处于暂停状态时,可能有如下原因
  1 因为身份验证失败,用户需要提供新的登陆凭证
  2 密码过期,需要一个新密码
  3 用户密码需要提供一个回拨号码
中止: 表示RasDial拨号失败,或者RasHangUp函数关闭连接
 
 4枚举连接函数RasEnumConnections:列出所有活动的RAS连接
DWORD RasEnumConnections(LPRASCONN lprasconn,LPDWORD lpcb,LPDWORD lpcConnections);
 5子连接句柄RasGetSubEntryHandle:该函数允许为多连接中一个具体的字条目取得一个连接句柄,
 
 远程访问服务器利用这个投影信息来表示网络上的一个远程客户机,比如说,在一个分帧协议上建立一个连接的时候,这个连接采用的是IP协议,IP配置信息(如分配的ip地址)就会从RAS服务器到客户机之间建立起来。要想获得PPP(点对点)分帧协议上的协议投影信息,就可以使用管理连接函数中的第3个函数RasGetProjectionInfo
 6RasGetProjectionInfo:
  DWORD RasGetProjectionInfo(
                             HRASCONN hrasconn,//连接句柄
                             RASPROJECTION rasprojection,//枚举类型
                             LPVOID lpprojection,//取得一个数据结构该结构和rasprojection中指                                                 //定的枚举类型有关联
                             LPDWORD lpcb//
                              );//该函数返回时,变量Lpcb会得到包含获得投影信息所需要的缓冲区                                //长度
相关函数:
 1 RasEnumEntries: //Ras规定要获得所有连接,必须连续两次调用RasEnumEntries函数,第一次要获得需要的缓冲区的大小,然后申请该缓冲区;在第二次调用的时候才能够真正获得所有的连接。
 2 增加新的连接主要通过调用
   RasCreatePhonebookEntry(GetSafeHwnd(), sCurrentProvider);//新建拨号连接
 3 删除连接
  {
 //结构体
 typedef DWORD (WINAPI* RDE)
 (
  LPCTSTR lpszPhonebook,  // pointer to full path and filename of
  LPCTSTR lpszEntry    // pointer to an entry name to delete
 );
 // 载入动态库
 HINSTANCE hLib = LoadLibrary(_T("RASAPI32.DLL"));
 if (NULL == hLib) return;
 RDE rde = (RDE) GetProcAddress(hLib, "RasDeleteEntryA");
 if (rde != NULL)
 {
  rde(NULL, sCurrentProvider);
  QueryConnections();//查询连接状态
  QueryPhones(sCurrentProvider);查询目前的拨号情况
 }
 ::FreeLibrary(hLib);

  }
 4 编辑已有连接:
  RasEditPhonebookEntry(GetSafeHwnd(), NULL, sCurrentProvider);//编辑已有连接
 
 5 拨号:
   {
 RASDIALPARAMS rdParams;
 char  szBuf[256] = "";
 //--------------------------------------------------------------------------------

 ZeroMemory(&rdParams, sizeof(RASDIALPARAMS));
 rdParams.dwSize = sizeof(RASDIALPARAMS);
 //允许标志一个电话薄条目,该条目包含在RASDIAL函数的lpszPhonebook参数列出的电话薄文件内
 //该参数比较重要,因为电话薄条目能够使用户更好地指定RAS连接属性。如选定一个Modem或者一个分帧协议等,
 //但是,为了使用RasDial而指定一个电话薄条目并不是非用不可,可以选择使用。如果该字段为空,
 //RasDial就会选择系统上安装的第一个可以使用的Modem,并依据下一个参数szPhoneNumber来拨叫连接
 lstrcpy(rdParams.szEntryName, sCurrentProvider);//

 //rdParams.szPhoneNumber 代表一个电话号码,优先于szEntryName指定的电话薄条目内包含的电话号码
 int pd = atoi(theApp.GetIniString(gchMain, gchPulseDialing, "1"));
 if (1 == pd)
  lstrcpy(rdParams.szPhoneNumber, CString("P") + GetPhoneListSelection());
 else
  lstrcpy(rdParams.szPhoneNumber, GetPhoneListSelection());
 
 //--------------------------------------------------------------------------------
 CString un, pw;
 un = theApp.GetIniString(sCurrentProvider, "UserName", "");
 pw = theApp.GetPassword(TRUE);
 lstrcpy(rdParams.szUserName, un);//标志RAS服务器上的用户进行身份验证时所用的登陆名
 lstrcpy(rdParams.szPassword, pw);//标志RAS服务器上的用户进行身份验证所用的密码
 //--------------------------------------------------------------------------------


 //允许指定一个电话号码,RAS服务器可以给据这个号码回拨,如果RAS服务器允许有一个回拨号码,他就中断原来的连接,利用指定的回拨号码回拨
 //这个特性非常有用,因为服务器可以知道连接的用户来自何处
 rdParams.szCallbackNumber[0] = '*';
 rdParams.szDomain[0] = '*';//可选项,指定最初的电话薄字条目拨叫一个RAS多链路连接

 //--------------------------------------------------------------------------------
 //拨号
 DWORD dwRet;
 dwRet = RasDial(NULL,
              NULL,
     &rdParams,
     0L,
     (LPVOID)RasDialFunc,
     &hRasConn);
 //--------------------------------------------------------------------------------
 if (dwRet)
 {
  if (RasGetErrorString((UINT)dwRet, (LPSTR)szBuf, 256) != 0)
  m_LastCallText = szBuf;
 }
 return TRUE;
}
//回调函数
VOID WINAPI RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)
{
 TRACE("RasDialFunc/n");
 if (unMsg != WM_RASDIALEVENT) TRACE("Strange event!/n");
 
 TRACE("RasDialFunc - exit/n");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值