Answer

专注于Mobile,WinCE
  首页  :: 新随笔  :: 联系 :: 管理

RAS函数

Posted on 2009-04-07 11:47  answer  阅读(2048)  评论(0编辑  收藏  举报

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。

6. RasGetProjectionInfo:
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");
  }

6. 挂断拨号连接函数 :
RasHangUp(hRasConn);//中心函数()
RasGetConnectStatus(hRasConn, &rStatus);//获取连接状态函数

来自:
http://blog.csdn.net/mmzsyx/archive/2008/07/25/2710871.aspx