新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 计算机科学论坛计算机技术与应用『 C/C++编程思想 』 → VC++实现拨号上网程序 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 2847 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: VC++实现拨号上网程序 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 VC++实现拨号上网程序


     
      大家知道,在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的有关内容

       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/8/26 10:11:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/23 1:30:06

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    46.875ms