WinCE 下 RAS 拨号连接的建立和拨号过程

在 CE 下如果系统没有建立拨号网络,要实现上网功能时,就需要通过代码来实现建立拨号网络、拨号实现上网的过程。

以下代码中的参数和拨号所用数值,都是电信 EVDO 的配置。如果换 GSM 或 WCDMA 时,请相应修改。

  1 HRASCONN ghRasConn = NULL;
  2 /*
  3  * 设置串口波特率和数据位等
  4 */
  5 BOOL CTCPClientDlg::SetDevCfg(TCHAR *ptcRasEntryName)
  6 {
  7     HKEY hk;
  8     unsigned char cDevCfg[684];
  9     TCHAR tcRegAddr[512 + 1];
 10     DWORD *pdwEapConnData = NULL;
 11
 12     ZeroMemory(tcRegAddr,sizeof(TCHAR) * (512 + 1));
 13     ZeroMemory(cDevCfg,sizeof(char) * 683);
 14     cDevCfg[0] = 0x30;
 15     cDevCfg[4] = 0x05;
 16     cDevCfg[9] = 0x01;
 17     cDevCfg[13] = 0xC2;     // 波特率
 18     cDevCfg[14] = 0x01;
 19     cDevCfg[18] = 0x08;     // 数据位
 20
 21     wsprintf(tcRegAddr,L"Comm\\RasBook\\%s",ptcRasEntryName);
 22
 23     if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER,tcRegAddr,0,0,&hk))
 24     {
 25         RegSetValueEx(hk,L"DevCfg",0,REG_BINARY,(LPBYTE)cDevCfg,sizeof(cDevCfg));
 26         RegSetValueEx(hk,L"EapConnData",0,REG_BINARY,(LPBYTE)pdwEapConnData,0);
 27         RegFlushKey(HKEY_CURRENT_USER);
 28
 29         RegCloseKey(hk);
 30
 31         return TRUE;
 32     }
 33     return FALSE;
 34 }
 35
 36 BOOL CTCPClientDlg::CreateRASLink(TCHAR *ptcRasEntryName,TCHAR *ptcModemName)
 37 {
 38     LPRASENTRY lpRasEntry = NULL;
 39     DWORD dwRasEntrySize = sizeof(RASENTRY);
 40     DWORD dwBufferSize = 0;
 41     DWORD dwRet = 0;
 42     BOOL bRet = TRUE;
 43
 44     if(NULL == ptcRasEntryName || NULL == ptcModemName)
 45         return FALSE;
 46
 47     RasGetEntryProperties(NULL,L"",NULL,&dwBufferSize,NULL,NULL);
 48     if(0 == dwBufferSize)
 49         return FALSE;
 50
 51     lpRasEntry = (LPRASENTRY)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwBufferSize);
 52     if(NULL == lpRasEntry)
 53         return FALSE;
 54
 55     ZeroMemory(lpRasEntry,sizeof(RASENTRY));
 56     lpRasEntry->dwSize = dwBufferSize;
 57     lpRasEntry->dwfOptions = RASEO_RemoteDefaultGateway;     // RASEO_PreviewUserPw 弹出用户名和密码输入框
 58     // Leo lpRasEntry->dwType = RASET_Phone;
 59     // lpRasEntry->dwCountryID = 86; // This member is currently ignored by Windows CE.
 60     lpRasEntry->dwCountryCode = 86;
 61     lstrcpy(lpRasEntry->szAreaCode,L"10");
 62     lstrcpy(lpRasEntry->szLocalPhoneNumber,L"#777");
 63
 64     lstrcpy(lpRasEntry->szDeviceType,RASDT_Modem);
 65     lstrcpy(lpRasEntry->szDeviceName,ptcModemName);      // 选用 Modem 的名字
 66     lpRasEntry->dwfNetProtocols = RASNP_Ip;
 67     lpRasEntry->dwFramingProtocol = RASFP_Ppp;
 68
 69     dwRet = RasSetEntryProperties(NULL,ptcRasEntryName,lpRasEntry,dwBufferSize,NULL,0);  //  创建连接
 70     if(0 != dwRet)
 71     {
 72         bRet = FALSE;
 73     }
 74     HeapFree(GetProcessHeap(),0,(LPVOID)lpRasEntry);
 75
 76     return bRet;
 77 }
 78
 79 BOOL CTCPClientDlg::NetworkDialAndParams(TCHAR *ptcRasEntryName)
 80 {
 81     DWORD dwRet = 0;
 82     UINT i = 0;
 83     RASDIALPARAMS rdParams;
 84
 85     ZeroMemory(&rdParams, sizeof(RASDIALPARAMS));
 86
 87     rdParams.dwSize = sizeof(RASDIALPARAMS);
 88     wcscpy(rdParams.szEntryName,ptcRasEntryName);
 89     // wcscpy(rdParams.szPhoneNumber,L"#777");
 90     wcscpy(rdParams.szUserName,L"card");
 91     wcscpy(rdParams.szPassword,L"card");
 92
 93     ghRasConn = NULL;
 94     dwRet = RasDial(NULL,NULL,&rdParams,0xFFFFFFFF,NULL,&ghRasConn);
 95     if(0 != dwRet)
 96     {
 97         RETAILMSG(1,(L"RasDial Error: %d.\r\n",dwRet));
 98         return FALSE;
 99     }
100     return TRUE;
101 }  

调用示例:

  1 void CNetworkDialDlg::OnBtnClickedOpenNet()
  2 {
  3     GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
  4     m_NetName.EnableWindow(FALSE);
  5
  6     // TODO: Add your control notification handler code here
  7     if(CreateRASLink(RASDIAL_NET_NAME,RASDIAL_NET_MODEM_NAME))
  8     {
  9         if(SetDevCfg(RASDIAL_NET_NAME))
 10         {
 11             if(NetworkDialAndParams(RASDIAL_NET_NAME,ghMainWnd))
 12             {
 13                 RETAILMSG(1,(L"[TCP Client]Dial new work success.\r\n"));
 14
 15                 SetTimer(RASDIAL_NETSHOW_TIMER_ID,RASDIAL_NETSHOW_TIME_OUT,NULL);
 16             }
 17             else
 18             {
 19                 RETAILMSG(1,(L"[TCP Client]Dial new work failed!\r\n"));
 20             }
 21         }
 22         else
 23         {
 24             RETAILMSG(1,(L"[TCP Client]Set RAS device config failed!\r\n"));
 25         }
 26     }
 27     else
 28     {
 29         RETAILMSG(1,(L"[TCP Client]Create RAS link failed!\r\n"));
 30     }
 31 }
 32
 33 BOOL CNetworkDialDlg::PreTranslateMessage(MSG* pMsg)
 34 {
 35     switch(pMsg->message)
 36     {
 37     case WM_RASDIALEVENT:
 38         OnRasDialEvent(pMsg->wParam,pMsg->lParam);
 39         break;
 40     case WM_USER + 0x1000:
 41         if(1 == pMsg->wParam)
 42         {
 43             GetDlgItem(IDC_STATIC_PING_STATUS)->SetWindowText(L"PING 状态: 成功");
 44         }
 45         else
 46         {
 47             GetDlgItem(IDC_STATIC_PING_STATUS)->SetWindowText(L"PING 状态: 失败");
 48         }
 49         break;
 50     default:
 51         break;
 52     }
 53
 54     return CDialog::PreTranslateMessage(pMsg);
 55 }
 56
 57
 58 /*
 59 [TCP Ras Event]1.RasState: Open port
 60 [TCP Ras Event]2.RasState: Port opened
 61 [TCP Ras Event]3.RasState: Device Connected
 62 [TCP Ras Event]4.RasState: All Device Connected
 63 [TCP Ras Event]5.Authenticating
 64 [TCP Ras Event]9.RAS Other RasState:12
 65 [TCP Ras Event]6.Authenticated, continue login...
 66 [TCP Ras Event]7.RASCS_Connected received
 67 */
 68 LRESULT CNetworkDialDlg::OnRasDialEvent(WPARAM wParam,LPARAM lParam)
 69 {
 70     RASCONNSTATE RasState = (RASCONNSTATE)wParam;
 71     DWORD dwError = (DWORD)lParam;
 72
 73     gRasState = RasState;
 74     switch(RasState)
 75     {
 76     case RASCS_OpenPort:
 77         RETAILMSG(1,(L"[TCP Ras Event]1.RasState: Open port\r\n"));
 78         break;
 79
 80     case RASCS_PortOpened:  // 端口已经打开
 81         RETAILMSG(1,(L"[TCP Ras Event]2.RasState: Port opened\r\n"));
 82         break;
 83
 84     case RASCS_DeviceConnected: // 正在连接
 85         {
 86             // dialDeviceConnected = TRUE;
 87             RETAILMSG(1,(L"[TCP Ras Event]3.RasState: Device Connected\r\n"));
 88         }
 89         break;
 90
 91     case RASCS_AllDevicesConnected: //
 92         // dialDeviceConnected = TRUE;
 93         RETAILMSG(1,(L"[TCP Ras Event]4.RasState: All Device Connected\r\n"));
 94         break;
 95
 96     case RASCS_Authenticate:
 97         {
 98             // dialDeviceConnected = TRUE;
 99             RETAILMSG(1,(L"[TCP Ras Event]5.Authenticating\r\n"));
100         }
101         break;
102
103     case RASCS_Authenticated:
104         {
105             // dialDeviceConnected = TRUE;
106             RETAILMSG(1,(L"[TCP Ras Event]6.Authenticated, continue login...\r\n"));
107         }
108         break;
109
110     case RASCS_AuthNotify:
111         {
112             RETAILMSG(1,(L"[TCP Ras Event]RASCS_AuthNofify received,Error: %d\r\n",dwError));
113             switch(dwError)
114             {
115             case ERROR_RESTRICTED_LOGON_HOURS:
116             case ERROR_ACCT_DISABLED:
117             case ERROR_PASSWD_EXPIRED:
118             case ERROR_NO_DIALIN_PERMISSION:
119             case ERROR_CHANGING_PASSWORD:
120             default:
121                 break;
122             }
123         }
124         break;
125
126     case RASCS_Connected:
127         {
128             RETAILMSG(1,(L"[TCP Ras Event]7.RASCS_Connected received\r\n"));
129             gbNetConnected = TRUE;
130         }
131         break;
132
133     case RASCS_Disconnected:
134         {
135             CString csError;
136             RETAILMSG(1,(L"[TCP Ras Event]8.RASCS_Disconnected received. Error: %d\r\n",dwError));
137
138             csError.Format(L"建立网络出现错误:%d",dwError);
139             GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
140             m_NetName.EnableWindow(TRUE);
141             giRasDialTimerCount = 0;
142             GetDlgItem(IDC_STATIC_STATUS)->SetWindowText(csError);
143             KillTimer(RASDIAL_NETSHOW_TIMER_ID);
144         }
145         break;
146
147     default:
148         RETAILMSG(1,(L"[TCP Ras Event]9.RAS Other RasState:%d\r\n", RasState));
149         break;
150     }
151
152     return TRUE;
153 }  
时间: 2025-01-02 14:00:37

WinCE 下 RAS 拨号连接的建立和拨号过程的相关文章

利用tcpdump分析工具来验证tcp连接的建立和关闭过程

本文要求读者在阅读之前应该对TCP通过三次握手建立和关闭连接有一定的了解,本文并没有详细讲解三次握手,只是通过一个实例对三次握手进行了一下验证. tcp连接的建立和关闭想必大家都已经非常熟悉了!通过三次握手建立连接和通过三次或者四次(半关闭)握手来关闭连接!在这里,我想通过一个具体的实例程序,来分析一下这个过程! 首先说用到的工具吧,linux下的tcpdump命令,和自己用c语言写的一个服务器端和一个客户端程序.程序的代码如下: 头文件: 1 #include<stdio.h> 2 #inc

10.TCP连接的建立与终止

1.建立连接协议 (1)请求端发送一个SYN段指明客户打算连接的服务器的端口,移机初始序号ISN.这个SYN段为报文段1. (2)服务器发回包含服务器的初始序号的SYN报文段作为应答.同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认.一个SYN将占用一个序号. (3)客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认. 这三个报文段完成连接的建立,这个过程也称为3次握手. 2.连接终止协议 终止一个连接需要进行4次握手,这是由TCP的半关闭造成的. 当

最简易无加密方式下的ppp拨号连接

PPP拨号连接建立虚拟网卡,并可以进行路由设置.几乎所有其他的连接服务都建立在其之上,PPPoE,PPTP,L2TP等等. 而其中一个最基本的话题可能被忽略了,PPP是如何工作的,如何使用PPP建立最简易的连接. PPP协议实际上非常简单,握手信号之后即进行数据交换,由于原来的PPP连接的使用都是基于电话MODEM的点对点通信,不考虑过于复杂的加密并保证传输效率,所以PPP的缺省设置是基于tty设备的,如果使用串口就是ttyS0-ttyS? 当然,使用pppd应用于附加服务并不必须使用tty设备

WinCE下GPRS自动拨号软件(GPRS AutoDial)

之前在WinCE下调试USB的3G Modem时,写过一个拨号助手RASManager,基本能用.后来车机卖到俄罗斯去,客户老M提供了一个更好的GPRS自动拨号软件GPRS AutoDial,功能完善且强大,RASManager基本就废弃了. GPRS AutoDial的使用方法如下图所示. GPRS AutoDial v1.4.3下载地址,http://files.cnblogs.com/files/we-hjb/GPRS_AD_1.4.3.rar

WIN10 拨号连接下 如何开启移动热点

错误提示为:我们无法设置移动热点,因为你的电脑未建立以太网,WIFI或手机网络连接. 解决方法: 1. 首先用手机或其他设备建立无线热点.  2. 电脑连接步骤1中的热点,电脑端打开移动热点.  3. 电脑端建立拨号上网连接,断开电脑与手机的无线连接(此处拨号连接如图为家里网络).  4. 电脑端进入设备管理器,选择步骤3中的拨号连接(宽带连接),右键属性,点击共享,将该网络共享到步骤2中建立的热点(如图为本地连接*13). 通过编辑 设置 WiFi 名称和密码 perfect 原文地址:htt

2G、3G无线路由器拨号连接过程

无线MODEM是为数据通信的数字信号在具有有限带宽的模拟信道上进行无线传输而设计的,它一般由基带处理.调制解调.信号放大和滤波.均衡等几部分组成.无线MODEM又名"无线调制解调器",区别于传统modem之处在于调制后的信号是通过无线传输的.无线modem有2G和3G各种网络的,如GPRS.CDMA.EDGE.WCDMA.CDMA2000(EVDO).TD-SCDMA等. 无线MODEM一般常见的接口有RS232串行口.USB口和PC卡式接口.RS232串行口和USB口一般都是外置式,

20160402_TCP连接的建立、终止和状态转换

原题: 以下不属于tcp连接断开的状态是? TIME_WAIT FIN_WAIT_1 SYNC_SENT FIN_WAIT_2 答案:SYNC_SENT -------------------------------------------------------------------------------- 本题知识点:计算机网络 TCP连接的建立:     下述步骤建立一个TCP连接:    1.服务器必须准备好接受外来的连接.这通过调用socket.bind和listen函数来完成,称

【网络协议】TCP连接的建立和释放

转载请注明出处:http://blog.csdn.net/ns_code/article/details/29382883 TCP首部格式 先看TCP报文段的格式,例如以下; TCP报文段首部的前20个字节是固定的,后面有4N字节是依据须要而添加的选项.因此TCP报文段的最小长度为20个字节. 首部固定部分的各字段的意义例如以下: 1.源port和目的port:加上IP首部的源IP地址和目的IP地址,确定唯一的一个TCP连接.另外通过目的port来决定TCP将数据报交付于那个应用程序,从而实现T

从Wireshark看TCP连接的建立与断开

TCP是一种面向连接.可靠的协议.TCP连接的建立与断开,都是需要经过通信双方的协商.用一句话概括就是:三次握手say hello(建立连接):四次握手say goodbye(断开连接).要了解TCP连接的建立与断开,就不得不需要了解TCP头的内容.然而,TCP头及其复杂,概括而言,我们需要了解以下内容: Sequence Number(Seq):序号.表示一个TCP片段,用于保证数据没有丢失 Acknowledgment Number(Ack):确认号.用于表示希望从对方得到的下一个数据包的序