用VC实现拨号上网的程序

  序:近日,有位朋友问到用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)    
    file://afx_msg_map(****)    
    ……    
    on_registered_message(wm_rasevent,   onrasdialevent)(<-加入此句)    
    file://afx_msg_map    
    end_message_map()    
    加入成员函数处理消息:    
    lresult   cdialinfo::onrasdialevent(wparam   wp,   lparam   lp)    
    {    
    rasconnstate   rasstate=   (rasconnstate)wp;    
    clistbox   *info   =(clistbox   *)getdlgitem(idc_infolist);    
    file://用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;    
    file://可定义类型为hrasconn的成员变量m_hrasconn来保存ras连接的句柄。    
    file://在调用rasdial时用指向m_hrasconn的指针作为lphrasconn参数。    
    file://既然用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的有关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值