前一段时间使用了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通讯部分的内容将会在下一篇文章中说明。