zoukankan      html  css  js  c++  java
  • 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通讯部分的内容将会在下一篇文章中说明。

  • 相关阅读:
    using 关键字在 C++ 中的几种用法
    Chromium 修改图片资源
    SAM&广义SAM
    Burnside和Polya
    笔记:杜教筛
    笔记:莫比乌斯反演
    Miller-Rabin
    点分治
    虚树
    计算几何
  • 原文地址:https://www.cnblogs.com/91program/p/5208726.html
Copyright © 2011-2022 走看看