龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

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

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
RASCONNSTATE rasstate= (RASCONNSTATE)wp; CListBox *info =(CListBox *)GetDlgItem(IDC_INFOLIST); //用ListBox 控件(ID为IDC-INFOLIST)来显示状态) switch(rasstate) { case RASCS_OpenPort: info→
  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的有关内容。

精彩图集

赞助商链接