一般用户的拨号上网,利用的是Windows的Remote Access Service(RAS,远程访问服务)。
下面介绍一下其在Visual C++下的实现。 
Visual C++为我们提供了包含RAS API声明的“ras.h″头文件。要在程序中实现拨号
上网功能,其大致过程如下: 
1. 利用Modem拨号进行连接,应使用RasDial函数:
其声明如下: 
DWORD RasDial(LPRASDIALEXTENSIONS lpRas DialExtensions,LPCTSTR lpszPhoneboo
k,LPRASDIALPARAMS lp Ras DialParams,DWORD dw Notifier Type,LPVOID lpv Notifier, 
  LPHRASCONN lph Ras Conn ) 
参数说明: 
lpRasDialExtensions和lpszPhonebook:可以忽略,设置为NULL。 
lpRasDialParams:这个参数很重要,它指向一个RASDIALPARAMS结构,该结构包含以下
几个成员: 
dwSize:应设定为sizeof(RASDIALPARAMS); 
szEntryName和szPhoneNumber:这两个参数有联系,szEntryName可以指定要建立的连接
,比方说“我的连接”等等,这是处理用户已经在“拨号网络”里建立的连接的。这时,Mo
dem将拨打你在“我的连接”中设定的ISP号码,此时szPhoneNumber成员设为空字符串“”即
可;如果你要在程序中自行指定要拨打的ISP号码的话,szEntryName可以设定为空字符串“
”,此时应设置szPhoneNumber为你的ISP号码(169,663等),特别的,对于用201电话卡来
上网的情况,可以设为“201,,,账号,密码#,,ISP号码#”(其中“,”表示停顿一段时
间(以等待确认账号,密码等),你可以根据自己所在位置的线路状况自行调节。 
SzCallBackNumber,szDomain:设为空串“”即可。 
SzUserName,szPassword:登录用户名和密码。如169公用账号guest,guest。 
其他成员不必设置。 
DwNotifierType:指定是由窗口还是由回调函数来处理确认消息。通过确认消息我们可
以得到RasDial过程的当前状态。如“正在打开段口”,“正在验证用户名和密码”等。也可
设为NULL。 
dwNotifier:指定处理确认消息的窗口或回调函数。也可设为NULL。 
LphRasConn:指向一个类型为HRASCONN的变量。在调用RasDial前必须指定为NULL,Ras
Dial若成功返回,则将RAS连接的句柄存放于它所指向的变量中。我们也可以通过此句柄来断
开连接。 
只要在程序中适当位置调用RasDial函数即可建立连接。
 2. 理确认消息以得到拨号过程的当前状态。
我们以指定窗口来处理确认消息为例说明如何得到拨号过程的当前状态。 
在处理确认消息的对话框类(或视图类等)的实现代码中加入: 
const UINT WM_RASEVENT = ::RegisterWindowMessageA(RASDIALEVENT); 
在Message Map中手工加入消息映射:(****是你定义的对话框类名称) 
BEGIN_MESSAGE_MAP(****, CDialog) 
//AFX_MSG_MAP(****) 
…… 
ON_REGISTERED_MESSAGE(WM_RASEVENT, OnRasDialEvent)(<-加入此句) 
//AFX_MSG_MAP 
END_MESSAGE_MAP() 
加入成员函数处理消息: 
LRESULT CDialInfo::OnRasDialEvent(WPARAM wp, LPARAM lp) 
RASCONNSTATE rasstate= (RASCONNSTATE)wp; 
CListBox* info =(CListBox *)GetDlgItem(IDC_INFOLIST); 
//用ListBox 控件(ID为IDC-INFOLIST)来显示状态) 
switch(rasstate) 
case RASCS_OpenPort: 
info->AddString(_T(″打开端口……″)); 
break; 
case RASCS_PortOpened: 
info->AddString(_T(″端口已打开.″)); 
break; 
case RASCS_ConnectDevice: 
info->AddString(_T(″连接设备……″)); 
break; 
case RASCS_DeviceConnected: 
info->AddString(_T(″设备已连接.″)); 
break; 
case RASCS_Authenticate: 
info->AddString(_T(″验证用户及密码″)); 
break; 
case RASCS_Authenticated: 
info->AddString(_T(″通过″)); 
break; 
case RASCS_Connected: 
info->AddString(_T(″已连接″)); 
reak; 
case RASCS_Disconnected: 
info->AddString(_T(″连接已断开″)); 
m_hRasConn=NULL; 
//可定义类型为HRASCONN的成员变量m_hRasConn来保存RAS连接的句柄。 
//在调用RasDial时用指向m_hRasConn的指针作为lphRasConn参数。 
//既然用m_hRasConn来保存连接句柄,连接断开后应重置为NULL. 
break; 
default: 
return (LRESULT)0; 
return (LRESULT)0; 
3. 断开连接: 
if (m_hRasConn != NULL) 
RasHangUp(m_hRasConn); 
m_hRasConn = NULL; 
m_OnDial=TRUE; 
::Sleep(2000); 
注意 : 
你也许注意到了以上代码中的Sleep函数,这里是必需的。需要一定时间来断开连接。如
果不等待一段时间,计算机有可能无法正常关闭端口。导致下一次无法拨号,只有重新启动
Windows才能解决。要预防此问题也可以调用RasGetConnectStatus函数,方法如下: 
RASCONNSTATUS rStatus; 
while(RasGetConnectStatus(m_hRasConn,&rStatus)!=ERROR_INVALID_HANDLE)
::Sleep(0);
4.在以下情况下: 
① 浏览网页时有时会出现停止响应,重启explorer后任务栏上的连接状态图标也许会消
失。 
② 希望在连接成功后,退出程序,再次执行此程序可选择断开连接。 
可以调用RasEnumConnection函数来得到当前连接的句柄。 
举例如下: 
HRASCONN hRasConnect;DWORD dwBuffferSize, dwNumofConnections;//缓冲区大小,连
接数 
LPRASCONN lpRasConn; 
lpRasConn = new RASCONN[3];//最多可得到3个连接句柄,客户端程序其实不必设为
3,因连接数有限,大部分仅一个连接。 
lpRasConn[0].dwSize = sizeof(RASCONN); 
dwBuffferSize = 32* sizeof(RASCONN);//求出由3个RASCONN结构构成的缓冲区大小 
RasEnumConnections(lpRas Conn, &dwBufferSize, &dwNumofConnections);//
此函数若成功则返回零。 
for(DWORD i=0; i   { 
hRasConnect = lpRasConn[i].hrasconn;//RASCONN结构的hrasconn成员为RAS连接句
柄 
RasHangUp(hRasConnect); 
::Sleep(2000); 
delete[] lpRasConn; 
在Windows 98,Visual C++ 6.0下调试通过。 
这样,一个实现基本拨号上网功能的程序就完成了。如果你要了解更多有关情况或服务
器端程序设计,可以参考MSDN→Platform SDK→Networking and Distributed Services→R
emote Access Service的有关内容

///

// 同步调用方式
RASDIALPARAMS RasDialParams;
// 总是设置dwSize 为RASDIALPARAMS结构的大小
RasDialParams.dwSize = sizeof(RASDIALPARAMS);
m_hRasconn = NULL; 
// 设置szEntryName为空字符串将允许RasDial使用缺省拨号属性
_tcscpy_s(RasDialParams.szEntryName, _T("宽带连接")); 
RasDialParams.szPhoneNumber[0] =  _T('\0');
RasDialParams.szCallbackNumber[0] = _T('\0');
_tcscpy_s(RasDialParams.szUserName, _T("05519487980"));
_tcscpy_s(RasDialParams.szPassword, _T("886146"));
RasDialParams.szDomain[0] =  _T('\0');
// 同步方式调用RasDial(第五个参数为NULL)
DWORD Ret = RasDial(NULL, NULL, &RasDialParams, 0, NULL, &m_hRasconn);
if (Ret != 0) 
TCHAR szBuff[MAX_PATH];
_stprintf_s(szBuff,_T("RasDial失败: Error = %d\n"), Ret);
OutputDebugString(szBuff);
AfxMessageBox(szBuff);
}
else
{
AfxMessageBox(_T("连接成功"));
}

拨号上网软件 C++ 实现相关推荐

  1. linux 拨号上网软件,Linux下Dr.com(802.1x)拨号上网完美解决(Ubantu)

    802.1x下的Dr.com在Linux拨号一直是大家头痛并难以解决的问题,以前在Ubantu下研究安装Dr.com的客户端但是都因为802.1x的端口认证问题而失败告终,现在终于搞定了完美解决的方法 ...

  2. 如何建立拨号上网连接

    建立拨号上网连接是上网的第一步骤,如何正确地设置拨号连接是您能否上网的前提,下面将向你介绍建立拨号连接的方法. 一.    WindowsXP/2003操作系统:     如果你使用的是Windows ...

  3. 禁止连接校园网(特别是软件拨号上网如:Netkeeper)后弹出认证网页

    禁止连接校园网(特别是软件拨号上网如:Netkeeper)后弹出认证网页 WINDOWS键+R:输入 :gpedit.msc打开如下本地策略编辑器. 进入如下界面,找到 "关闭Windows ...

  4. 关于linux拨号上网的软件实现方案[原创]

    一.Linux上使用pppd来实现拨号上网.我们首先要确认 Linux 系统是否支持 PPP 功能.如果当前 kernel 不支持 PPP,需要重新编译生成一个支持 PPP 的 kernel.(所幸现 ...

  5. linux网卡设置adsl上网,Linux下设置ADSL自动拨号上网

    前段时间下载了红帽的linux,版本为redhat 9.0,整整刻了三张CD.最初是为了体验一下linux下QQ聊天软件的功能,最后因内核太低(官方推荐内核在2.6以上,我下载的版本是2.4)而告终. ...

  6. linux中的pppoe拨号上网

    实例:(linux中的pppoe拨号上网) ① 安装软件:把下载的pppoe传到linux下的/root目录下,在终端对软件进行拆包: ll:查看目录,能看见软件包的名字 tar -zxvf rp-p ...

  7. WINCE+6410 拨号上网

    我们现在的模块用的是USB接口,然后模拟成一个COM6进行通信,在CE的: 控制面板->网络连接 里要新建一个连接,选择"拨号连接"然后设置好区域代码,还有附加解调器命令+C ...

  8. linux系统如何拨号上网连接,教你在Linux下如何使用ADSL拨号上网

    教你在Linux下如何使用ADSL拨号上网 发布时间:2007-10-29 10:22:09来源:红联作者:demon 一.如果是新手刚开始使用Linxu的话,可用图形界面: 办法:直接在网络里建立新 ...

  9. (clion 安装插件联网络失败,pycharm pip联网失败)当电脑选择拨号上网时,解决系统代理被篡改/pip提示“目标计算机积极拒绝,无法连接”的方法! [ 此方法绝对解决系统代理被篡改问题 ]

    当电脑选择拨号上网时,解决系统代理被篡改/pip提示"目标计算机积极拒绝,无法连接"的方法 (clion 安装插件失败没网络,pycharm 插件或库下载失败,游览器可以上网,但c ...

最新文章

  1. 设计模式-行为-Iterator(迭代器)模式
  2. 解析ASP网页的执行顺序
  3. android 自定义paint,Android中自定义常用的三个对象解析(Paint,Color,Canvas)
  4. SwiftUI之深入解析如何实现3D Scroll效果
  5. rk3399性能_AIIA AI公布首轮评估结果:瑞芯微RK3399数据抢眼
  6. lte接口流程图_请画出LTE系统的组网图及标注接口。
  7. 20155315 2016-2017-2 实验二《Java面向对象程序设计》实验报告
  8. 2020.8.2- 参加华数之星数学比赛 银奖(二等奖)
  9. SQL Server 2019重新安装失败的处理方法
  10. 自己建设网站需要学习什么?
  11. php的命名空间和自动加载实现
  12. PDF可以修改吗,如何在PDF上修改文字
  13. Python中的shuffle()函数
  14. 第六届蓝桥杯大赛个人赛决赛(软件类)真题
  15. 人工神经网络基本构成有哪些,具有什么特征
  16. js以索引形式遍历map对象
  17. Android Tab 控件的使用
  18. Tex数学公式及字符
  19. HTTP Status 406 -with characteristics not acceptable according to the request accept headers.
  20. 模式先行区块链商城将颠覆传统商城

热门文章

  1. GBase 8c V3.0.0数据类型——data_part
  2. 16.钩子事件hookEvent与插件。
  3. MES项目导入-案例分析-PCB制造厂ERP导入项目个案分析
  4. 基于C++、MFC、halcon实现视觉定位【附部分源码】
  5. js uri解码_JS——URI编码和解码
  6. USB2.0电气层信号的表示及速率的识别过程
  7. 微信公众号简单开发(7)语音消息
  8. Java程序员,到底要不要转行大数据?
  9. 霍尔电流传感器相关问题
  10. 杰理AC690X系列---RGB彩灯随音乐跳动(10)