RAS使用拨号网络拨号的类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RAS使用拨号网络拨号的类相关的知识,希望对你有一定的参考价值。

前一段时间使用了Socket与远程PC进行UDP通讯,使用了一个RAS拨号类,与大家分享一下。

在使用下面的代码建立 TCP/IP 链接前,请断开 ActiveSync,否则会导致失败。

 

头文件:RasCtrl.h 

 1 #if !defined  _RAS_PPP_CTRL_H_  
 2 #define       _RAS_PPP_CTRL_H_  
 3 #if _MSC_VER > 1000  
 4 #pragma once  
 5 #endif // _MSC_VER > 1000  
 6 #include "ras.h"  
 7 class CRasCtrl    
 8 {  
 9 private:  
10     LPVOID m_MsgHandle;   
11     HRASCONN m_hRasConn;  
12     //BOOL bConnect;  
13     //CString m_UserName;  
14     //CString m_PassWord;  
15     CString m_EntryName;  
16 public:  
17     CRasCtrl();  
18     virtual ~CRasCtrl();  
19     //拨号  
20     bool DialUp(CString UserName,CString Password);  
21     //挂断  
22     bool HangUp();  
23     //设置处理方式  
24     void SetHandle(LPVOID _handle);  
25     bool IsConnect(void);  
26     //通过获取WM_RASDIALEVENT消息,判断拨号状态  
27     //static CString GetState(unsigned int message);   
28 };  
29 #endif   

源文件:RasCtrl.cpp 

  1 #include "stdafx.h"  
  2 #include "RasCtrl.h"  
  3 #include "ras.h"  
  4 #include "Raserror.h"  
  5 #ifdef _DEBUG  
  6 #undef THIS_FILE  
  7 static char THIS_FILE[]=__FILE__;  
  8 #define new DEBUG_NEW  
  9 #endif  
 10 //////////////////////////////////////////////////////////////////////  
 11 // Construction/Destruction  
 12 //////////////////////////////////////////////////////////////////////  
 13 CRasCtrl::CRasCtrl()  
 14 {     
 15     m_hRasConn = NULL;  
 16     //bConnect = false;  
 17     m_EntryName = L"MyLink";    //建立拨号的名字,保持一致  
 18 }  
 19 CRasCtrl::~CRasCtrl()  
 20 {  
 21     HangUp();  
 22 }  
 23 bool CRasCtrl::DialUp(CString UserName,CString Password)  
 24 {  
 25     RASDIALPARAMS rdParams;    //拨号连接的信息  
 26     ZeroMemory(&rdParams, sizeof(RASDIALPARAMS));  
 27     rdParams.dwSize = sizeof(RASDIALPARAMS);  
 28     //HangUp();  
 29     //Sleep(100);  
 30     //RasSetEntryDialParams(NULL,&rdParams,true);  
 31     //RasGetEntryProperties();  
 32     wcscpy(rdParams.szEntryName, m_EntryName);  
 33     wcscpy(rdParams.szUserName, UserName);  
 34     wcscpy(rdParams.szPassword, Password);   
 35     //lstrcpy(rdParams.szPhoneNumber, _T(""));  
 36     //lstrcpy(rdParams.szDomain, _T(""));  
 37     m_hRasConn = NULL;  
 38     DWORD dwRet = ::RasDial(NULL, NULL, &rdParams, 0xFFFFFFFF, m_MsgHandle , &m_hRasConn);  //如果函数成功,则返回0  
 39         //也可以RasHangUp(m_hRasConn);挂断,不过我曾经试过拨号成功m_hRasConn为NULL的情况,一时不清除怎么回事,所以把挂断函数改了。  
 40     //RasDial函数的使用要小心一点跟windows平台有些差异。  
 41     //DWORD iRet = GetLastError();  
 42     if (dwRet)   
 43     {  
 44         //bConnect = false;  
 45         return false;  
 46     }  
 47     //bConnect = true;  
 48     return true;  
 49 }  
 50 bool CRasCtrl::HangUp()  
 51 {  
 52     int index;                 // An integer index  
 53     DWORD dwError,             // Error code from a function call   
 54     dwRasConnSize,       // Size of RasConn in bytes  
 55     dwNumConnections;    // Number of connections found   
 56     RASCONN RasConn[20];       // Buffer for connection state data   
 57     // Assume the maximum number of entries is 20.   
 58     // Assume no more than 20 connections.  
 59     RasConn[0].dwSize = sizeof (RASCONN);  
 60     dwRasConnSize = 20 * sizeof (RASCONN);  
 61     // Find all connections.  
 62     if (dwError = RasEnumConnections (RasConn, &dwRasConnSize, &dwNumConnections))  
 63     {  
 64         return false;  
 65     }  
 66     // If there are no connections, return zero.  
 67     if (!dwNumConnections)  
 68     {  
 69         return false;  
 70     }  
 71     // Terminate all of the remote access connections.  
 72     for (index = 0; index < (int)dwNumConnections; ++index)  
 73     {  
 74         //这样做主要是不想关掉usb连接,因为通过这种方法得到的连接中包括了USB同步的连接。  
 75         if (wcsstr(RasConn[index].szEntryName,_T("MyLink"))!=NULL)  
 76         {  
 77             if (dwError = RasHangUp (RasConn[index].hrasconn))  
 78             {  
 79                 return false;  
 80             }  
 81         }  
 82     }  
 83     return TRUE;  
 84 }  
 85 // 传递接收消息的窗体句柄进来,这样窗体才能接收到WM_RASDIALEVENT消息。  
 86 // wParam的值有RASCS_Connected,RASCS_Disconnected等,具体查看msdn  
 87 // wince不支持其他方式。        
 88 void CRasCtrl::SetHandle(LPVOID _handle)  
 89 {    
 90     m_MsgHandle = _handle;  
 91 }  
 92 bool CRasCtrl::IsConnect(void)  
 93 {  
 94     if(NULL != m_hRasConn)  
 95     {  
 96         RASCONNSTATUS rasConStatus;  
 97         rasConStatus.dwSize = sizeof(RASCONNSTATUS);  
 98         RasGetConnectStatus(m_hRasConn,&rasConStatus);  
 99         if(RASCS_Connected == rasConStatus.rasconnstate)  
100         {  
101             return true;  
102         }  
103     }  
104     return false;  
105 }  
106 /* 
107 这个用于解析PPPoE返回的消息的 
108 CString CRasCtrl::GetState(unsigned int message) 
109 { 
110  CString str; 
111  switch(message) 
112  { 
113  ... ... ... 
114  case RASCS_Connected: 
115   str= LoadStringEx(IDS_LINKED); 
116   break; 
117  case RASCS_Disconnected: 
118   str= LoadStringEx(IDS_UNLINKED); 
119   break; 
120  } 
121  return str; 
122 } 
123 */  

判断链接是否已经建立:在主窗体上启动一Timer.

 1 if(RASDIAL_NETSHOW_TIMERID == nIDEvent)  
 2     {  
 3         CString csConnecting;  
 4         giRasDialTimerCount++;  
 5         csConnecting.Format(L"正在建立链接(%02d)",giRasDialTimerCount);  
 6         GetDlgItem(IDC_CONNECTSTATUS)->SetWindowText(csConnecting);  
 7         if(m_RasConnect.IsConnect())  
 8         {  
 9             RETAILMSG(1,(L"UDP Client,Ras net available{%d}/r/n",giRasDialTimerCount));  
10             KillTimer(nIDEvent);  
11             giRasDialTimerCount = 0;  
12             csConnecting.Format(L"建立链接成功");  
13             GetDlgItem(IDC_CONNECTSTATUS)->SetWindowText(csConnecting);  
14             GetDlgItem(IDC_BTNOPEN2)->EnableWindow(FALSE);  
15             GetDlgItem(IDC_BTNOPEN3)->EnableWindow(TRUE);  
16         }  
17         else  
18         {  
19             RETAILMSG(1,(L"UDP Client,Ras net not available{%d}/r/n",giRasDialTimerCount));  
20         }  
21     }  

使用:

1)建立链接:m_RasConnect.DialUp(L"",L"");

2)断开链接:

1 if(m_RasConnect.IsConnect())  
2 {  
3         m_RasConnect.HangUp();  
4 }  

说明:此文章只是建立 TCP/IP 链接的过程,使用UDP通讯部分的内容将会在下一篇文章中说明。

以上是关于RAS使用拨号网络拨号的类的主要内容,如果未能解决你的问题,请参考以下文章

RAS 和 NDIS 拨号模式

UDP 通讯代码

Linux Ubuntu系统之PPP拨号经验分享

XP网络连接拨号时显示错误693

如何防止出现新连接的网络位置对话框(家庭、工作、公共)?

使用L2TP拨号如何用无线路由共享上网