分享
 
 
 

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

王朝c/c++·作者佚名  2006-01-06
窄屏简体版  字體: |||超大  

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有