开发一个类似上网拨号程序.

lifei 2000-07-13 09:48:00
开发一个类似win95/98系统中的上网拨号程序.实现自动拨号登录远程nt服务器.
关键技术是:电话拨号、通信协议、登陆的具体实现,最好是用C++语言编写。
...全文
130 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
su 2000-07-14
  • 打赏
  • 举报
回复

  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下调试通过。
U皮特U 2000-07-14
  • 打赏
  • 举报
回复
我的主页上有源码可以参考:
http://go.163.com/~freecode/vc/sharecode/netcomm/dial.zip

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧