• 网络学院
  • IT资讯
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
VC++实现拨号上网程序详解
  站点:
  • 首 页
  • 最新软件
  • 文章教程
  • 国内软件
  • 国外软件
  • 绿色软件
  • 源码下载
  • 字体下载
VC++实现拨号上网程序详解
软件发布 VC++实现拨号上网程序详解
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件 绿软下载
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回文章教程首页 >> 文章首页 >> 编程技术 >> VC教程 >> VC++实现拨号上网程序详解

VC++实现拨号上网程序详解

添加时间: 2006-2-11 0:54:48  作者: VC教程  阅读次数:532   来源: http://www.d9soft.com

       

  大家知道,在Netants、DownLoad Expert等软件中都带有定时拨号上网下载软件的功能。而一般用户的拨号上网,利用的是Windows的Remote Access Service(RAS,远程访问服务)。下面介绍一下其在Visual C++下的实现。

  Visual C++为我们提供了包含RAS API声明的“ras.h″头文件。要在程序中实现拨号上网功能,其大致过程如下:

  1. 利用Modem拨号进行连接,应使用RasDial函数。

  其声明如下:

  DWORD Ras Dial(LPRASDIALEXTENSIONS lpRas DialExtensions,LPCTSTR lpszPhonebook,LPRASDIALPARAMS lp Ras DialParams,DWORD dw Notifier Type,LPVOID lpv Notifier,
  LPHRASCONN lph Ras Conn )

  参数说明:

  lpRasDialExtensions和lpszPhonebook:仅在Windows NT下有效,在Windows 95下,这两个参数被忽略。

  lpRasDialParams:这个参数很重要,它指向一个RASDIALPARAMS结构,该结构包含以下几个成员:

  dwSize:应设定为sizeof(RASDIALPARAMS);

  szEntryName和szPhoneNumber:这两个参数有联系,szEntryName可以指定要建立的连接,比方说“我的连接”等等,这是处理用户已经在“拨号网络”里建立的连接的。这时,Modem将拨打你在“我的连接”中设定的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,RasDial若成功返回,则将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, &dw Buffer Size, &dw Numof Connections);//此函数若成功则返回零。
  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→Remote Access Service的有关内容。

 

上下文章:

 

上一篇文章: VC++高级学习:监视服务器端口 下一篇文章: VC中实现OfficeXP风格的工具栏及菜单

相关文章:

  • 飞速在线看视频 傲盾加速帮你实现速度感受
  • 用端口碰撞技术实现服务器远程管理
  • 详解VLAN+路由器典型配置实例教程
  • 上网高效率 宽带路由优化技巧放送
  • AV杀手变种强行关闭杀度软件与下载恶意程序

相关软件:

  • ADSL拨号计时器 V7.35 绿色版
  • 瑞星卡卡上网安全助手 6.0.0.29 正式版
  • FTP远程文件同步更新程序 1.0.0.0
  • 3721上网助手之网络加速专家 4.2 Build 01.18
  • 关闭有害木马端口程序
  • 终极程序加密器 2.98

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

编程技术分类导航

  • ASP & ASP.NET教程
  • PHP教程
  • JSP教程
  • C/C++教程
  • VB & VB.NET教程
  • VC教程
  • Delphi教程
  • BCB教程
  • VFP教程
  • PB教程
  • JAVA教程
  • XML教程
  • C#教程
  • CGI教程

本类经典文章推荐

  • VC++之Button控件
  • VC++之Static Box控件
  • VC++之Edit Box控件
  • VC++之Static Box控件
  • VC++之Edit Box控件
  • VC++之Scroll Bar
  • VC++之Scroll Bar
  • VC++之List Box/Check List Box控...
  • VC++ Combo Box/Combo Box Ex控件
  • VC++ List Ctrl控件

VC教程阅读排行

  • VC++之List Box/Check List Box控...
  • VC++ List Ctrl控件
  • VC++ Combo Box/Combo Box Ex控件
  • VC++之Button控件
  • VC++之Tab Ctrl控件
  • VC++之Edit Box控件
  • VC++之Edit Box控件
  • VC遍历整个目录树查找文件
  • VC++之Scroll Bar
  • 深入编程:控制面板知多少?

编程技术阅读总排行

  • VB入门教程之一
  • Java连接数据库实例
  • 第二章 PowerBuilder 入门之创建新...
  • VC++之List Box/Check List Box控...
  • 第一章 什么是PowerBuilder
  • VC++ List Ctrl控件
  • VC++ Combo Box/Combo Box Ex控件
  • 学C++不得不看的一篇文章
  • VB入门教程之二
  • VC++之Button控件

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有