拨号上网程序

news/2025/3/1 20:37:28/
大家知道,在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 lpszPhoneboo
k,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可以指定要建立的连接
,比方说“我的连接”等等,这是处理用户已经在“拨号网络”里建立的连接的。这时,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, &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→R
emote Access Service的有关内容

http://www.ppmy.cn/news/526466.html

相关文章

android 拨号上网流程

android 网络拨号流程: frameworks\base\services\java\com\android\server\ ConnectivityService.java ->[MyHandler ->handleMessage ->case EVENT_SET_MOBILE_DATA ->handleSetMobileData] frameworks\base\services\java\com\android\server\ ConnectivityServ…

通过电话拨号上网的家用计算机,拨号上网需计算机、电话线、帐号和()

相关题目与解析 使用电话线拨号上网的计算机必须配备(__)。A.网卡B.电话机C.调制解调器D.集线器 拨号上网需要准备的设备主要有()。A.计算机B.调制解调器C.电话线D.耳机 计算机和因特网的连接方式包括()。A、通过普通电话线拨号上网B、通过ISDN线路拨号上网C、宽带ADSL ●通过拨…

拨号上网和宽带区别

连接方式和带宽不一样&#xff1a; 拨号是用电话线&#xff0c;带宽14kbps-56kbps(Modem不同速度不同&#xff09;&#xff0c;而宽带用网线连到Adsl Modem&#xff0c;再连到电话线&#xff0c;须向营运商申请&#xff0c;带宽1&#xff0d;3Mbps都有&#xff0c;带宽大的速度…

拨号上网

电话拨号&#xff0c;上网的数据是调制在语音频段上的&#xff0c;局端是接入服务器。也就是说相当于电脑拨打了一个电话到接入服务器&#xff0c;如果网络一直连接&#xff0c;这个电话就不能挂断。由于语音带宽的限制&#xff0c;此方式上网的最大速率是56kbps左右&#xff0…

PPPOE拨号上网

因为没有真正的运营上账号和密码&#xff0c;这里就临时搭建测试 pppoe服务端配置 [Internet]ip pool pppoe 创建地址池 [Internet-ip-pool-pppoe]network 123.1.1.0 mask 24 配置IP地址段 [Internet-ip-pool-pppoe]dns-list 114.114.114.114 配置DNS [Internet-ip-pool-pp…

如何建立拨号上网连接

建立拨号上网连接是上网的第一步骤&#xff0c;如何正确地设置拨号连接是您能否上网的前提&#xff0c;下面将向你介绍建立拨号连接的方法。一、 WindowsXP/2003操作系统&#xff1a; 如果你使用的是WindowsXP/2003操作系统&#xff0c;可以直接在网上邻居中新建网络连接…

使用手机拨号上网

今天呢&#xff01;我才发现自己的电&#xff0c;电脑有蓝牙功能&#xff0c;而且才知道现在可以用手机连接电脑拨号上网&#xff0c;我就去查了一些资料&#xff0c;自己去研究了下子&#xff0c;觉得还行。下面就是步骤&#xff1a; 第一&#xff1a; 下载手机驱动 大家都知道…

实现拨号上网

实现拨号上网     本例知识要点&#xff1a;   1&#xff0e; 远程访问服务&#xff08;RAS&#xff09;简介   远程访问服务&#xff08;Remote Access Service 简称RAS&#xff09;是Windows 操作系统提供的系统服务之一&#xff0c;通过电话线可以使单独的计算机接入…