RAS使用拨号网络拨号的类

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

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

 

头文件:RasCtrl.h 

#if !defined _RAS_PPP_CTRL_H_ #define _RAS_PPP_CTRL_H_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "ras.h" class CRasCtrl { private: LPVOID m_MsgHandle; HRASCONN m_hRasConn; //BOOL bConnect; //CString m_UserName; //CString m_PassWord; CString m_EntryName; public: CRasCtrl(); virtual ~CRasCtrl(); //拨号 bool DialUp(CString UserName,CString Password); //挂断 bool HangUp(); //设置处理方式 void SetHandle(LPVOID _handle); bool IsConnect(void); //通过获取WM_RASDIALEVENT消息,判断拨号状态 //static CString GetState(unsigned int message); }; #endif  

 

 

源文件:RasCtrl.cpp 

#include "stdafx.h" #include "RasCtrl.h" #include "ras.h" #include "Raserror.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CRasCtrl::CRasCtrl() { m_hRasConn = NULL; //bConnect = false; m_EntryName = L"MyLink"; //建立拨号的名字,保持一致 } CRasCtrl::~CRasCtrl() { HangUp(); } bool CRasCtrl::DialUp(CString UserName,CString Password) { RASDIALPARAMS rdParams; //拨号连接的信息 ZeroMemory(&rdParams, sizeof(RASDIALPARAMS)); rdParams.dwSize = sizeof(RASDIALPARAMS); //HangUp(); //Sleep(100); //RasSetEntryDialParams(NULL,&rdParams,true); //RasGetEntryProperties(); wcscpy(rdParams.szEntryName, m_EntryName); wcscpy(rdParams.szUserName, UserName); wcscpy(rdParams.szPassword, Password); //lstrcpy(rdParams.szPhoneNumber, _T("")); //lstrcpy(rdParams.szDomain, _T("")); m_hRasConn = NULL; DWORD dwRet = ::RasDial(NULL, NULL, &rdParams, 0xFFFFFFFF, m_MsgHandle , &m_hRasConn); //如果函数成功,则返回0 //也可以RasHangUp(m_hRasConn);挂断,不过我曾经试过拨号成功m_hRasConn为NULL的情况,一时不清除怎么回事,所以把挂断函数改了。 //RasDial函数的使用要小心一点跟windows平台有些差异。 //DWORD iRet = GetLastError(); if (dwRet) { //bConnect = false; return false; } //bConnect = true; return true; } bool CRasCtrl::HangUp() { int index; // An integer index DWORD dwError, // Error code from a function call dwRasConnSize, // Size of RasConn in bytes dwNumConnections; // Number of connections found RASCONN RasConn[20]; // Buffer for connection state data // Assume the maximum number of entries is 20. // Assume no more than 20 connections. RasConn[0].dwSize = sizeof (RASCONN); dwRasConnSize = 20 * sizeof (RASCONN); // Find all connections. if (dwError = RasEnumConnections (RasConn, &dwRasConnSize, &dwNumConnections)) { return false; } // If there are no connections, return zero. if (!dwNumConnections) { return false; } // Terminate all of the remote access connections. for (index = 0; index < (int)dwNumConnections; ++index) { //这样做主要是不想关掉usb连接,因为通过这种方法得到的连接中包括了USB同步的连接。 if (wcsstr(RasConn[index].szEntryName,_T("MyLink"))!=NULL) { if (dwError = RasHangUp (RasConn[index].hrasconn)) { return false; } } } return TRUE; } // 传递接收消息的窗体句柄进来,这样窗体才能接收到WM_RASDIALEVENT消息。 // wParam的值有RASCS_Connected,RASCS_Disconnected等,具体查看msdn // wince不支持其他方式。 void CRasCtrl::SetHandle(LPVOID _handle) { m_MsgHandle = _handle; } bool CRasCtrl::IsConnect(void) { if(NULL != m_hRasConn) { RASCONNSTATUS rasConStatus; rasConStatus.dwSize = sizeof(RASCONNSTATUS); RasGetConnectStatus(m_hRasConn,&rasConStatus); if(RASCS_Connected == rasConStatus.rasconnstate) { return true; } } return false; } /* 这个用于解析PPPoE返回的消息的 CString CRasCtrl::GetState(unsigned int message) { CString str; switch(message) { ... ... ... case RASCS_Connected: str= LoadStringEx(IDS_LINKED); break; case RASCS_Disconnected: str= LoadStringEx(IDS_UNLINKED); break; } return str; } */ 

 

 

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

if(RASDIAL_NETSHOW_TIMERID == nIDEvent) { CString csConnecting; giRasDialTimerCount++; csConnecting.Format(L"正在建立链接(%02d)",giRasDialTimerCount); GetDlgItem(IDC_CONNECTSTATUS)->SetWindowText(csConnecting); if(m_RasConnect.IsConnect()) { RETAILMSG(1,(L"UDP Client,Ras net available{%d}/r/n",giRasDialTimerCount)); KillTimer(nIDEvent); giRasDialTimerCount = 0; csConnecting.Format(L"建立链接成功"); GetDlgItem(IDC_CONNECTSTATUS)->SetWindowText(csConnecting); GetDlgItem(IDC_BTNOPEN2)->EnableWindow(FALSE); GetDlgItem(IDC_BTNOPEN3)->EnableWindow(TRUE); } else { RETAILMSG(1,(L"UDP Client,Ras net not available{%d}/r/n",giRasDialTimerCount)); } } 

 

使用:

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

2)断开链接:

if(m_RasConnect.IsConnect()) { m_RasConnect.HangUp(); } 

 

 

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

你可能感兴趣的:(网络,File,null,Integer,WinCE,通讯)