编写一个拨号上网及计费程序需要调用RAS API,我在CSDN及VCHELP上找到
几篇文章,但对基本的原理说明不是很详细,对于我这样一个菜鸟而言似乎
不易懂,因此只好翻译了MSDN的部分内容并补充了一点点,具体的统计流量
请参考VCHELP上的文章,本文仅供大家参考,避免
重复工作。
----------------------
RAS使用RasDial函数开始建立连接,建立后由Remote Access
Connection Manager接管。Remote Access Connection Manager
处理建立连接的details,并提供client连接操作的状态信息。
当应用程序load RASAPI32.DLL时,自动启动Remote Access
Connection Manager。
RasDial开始建立连接时,需要定义以下信息:
连接信息:用于建立连接;
notification handler(可选的):在连接过程中获取连接消息;
RASDIALEXTENSIONS结构(可选的):一个扩展,允许或禁止扩展功能(如
允许client直接使用modem的一些设置,控制RAS使用phonebook entry中的
前缀或后缀,在连接操作中支持paused status。
同步操作
当RasDial作为同步调用时,函数直到连接建立或产生错误时才返回。
主要缺点在于不能获得连接过程的状态信息。
异步操作
异步时,必须指明一个notification handler,他可以是一个接受消息的
窗口,也可是回调函数——RasDialFunc, RasDialFunc1, or RasDialFunc2
。如同步操作一样,在发生错误时必须关闭连接操作。
Phonebook 文件以及连接信息
为了建立连接,RasDial必须指明连接信息,通过phone-book entry(包括
电话号码,BPS,用户验证信息和其他连接信息)。
为了显示phonebook entries的列表,RAS client可以用RasEnumEntries函数
来列举。如果不使用phonebook entry,则调用RasDial时将szEntryName
(RASDIALPARAMS结构成员)设为空字符串,而RASDIALPARAMS.szPhoneNumber
必须包含拨号号码,这时Remote Access Connection Manager使用第一个可用
的modem port以及其他设置的缺省值。
用户验证信息
RAS client用RASDIALPARAMS结构(RasDial)定义用户名及密码,否则
Remote Access Connection Manager使用当前登陆的用户名及密码。
如果不能登陆,则允许连接操作进入paused state,使用户重新确定验证信息。
其他连接信息
RASDIALPARAMS结构还包括以下连接信息:
代替phonebook entry号码的电话号码;
一个提供给server call back的号码(缺省为no callback);
The name of the remote network domain on which the authentication
is to occur。
连接状态
enum RASCONNSTATE设置了一组与连接状态相应的值。连接状态分为三组:
运行态:连接设备,验证用户,等待server callback。RAS client不提供
操作,仅将notification提供给用户直到发生错误。
Paused states:暂停连接操作,获得新的用户名或密码等信息。
Terminal states:发生在连接成功建立时、连接操作失败或调用RasHangUp
也可使用RasGetConnectStatus来获取当前连接状态。
Notification Handlers
一个Notification Handlers可处理的操作如下:
1、处理错误,此时应当调用RasHangUp结束连接,可用RasGetErrorString获得错误
描述;
2、提供链接状态,对于notification handler并不需要采取任何操作,除非产生
错误,可用RasGetConnectStatus来获得设备名及类型(in RASCS_ConnectDevice
notification call it),用RasGetProjectionInfo(in RASCS_Projected
notification)获得如连接的网络协议;
3、处理paused states,缺省时paused state is disabled,如果要支持则设置
RDEOPTS_PausedStates 标记( in the RASDIALEXTENSIONS structure),
当paused state产生时,Remote Access Connection Manager激活notification
handler ,如果paused state is disabled,则在notification message 指明
出错,并且连接失败,如果支持paused state,则暂停连接等待用户相应,客户
可以第二次调用RasDial来恢复连接(第二次调用要指明一些信息,The
connection handle that was returned by the original RasDial call.
The same notification handler as the original RasDial call.
The user's input in the appropriate members of the RASDIALPARAMS
structure. Other members of the RASDIALPARAMS structure should have
the same information as specified in the original RasDial call.
,而且不能从notification handler调用),或RasHangUp终止连接;
4、连接操作结束时,告知用户,发生在以下情况:a.连接建立,接受
RASCS_Connected,客户程序可以退出而不断开连接 b.发生错误,获取错误及
连接状态 c.由RasHangUp断开。
有三种handler,接受同样的信息:当前的连接状态及错误号。
RasDialFunc:仅接受当前连接态与错误码;
RasDialFunc1:可以接受连接句柄HRASCONN及扩展错误信息,该参数可用于支持
多个同时发生的连接操作;
Window handle:一个窗口句柄,RAS送WM_RASDIALEVENT消息(含有连接状态与错
误码),通常应用于16位WINDOWS,因他不支持回调函数。
Remote Access Connection Manager 悬挂起连接操作直到notification handler
返回,因此handler必须尽快返回。
一些可在handler中调用的函数: (RasGetConnectStatus, RasEnumEntries,
RasEnumConnections, RasGetErrorString, and RasHangUp)
Disconnecting
当用户开始连接操作时,RasDial接受连接句柄HRASCONN,如果该句柄非NULL
则可用RasHangUp结束连接。如果发生错误时则必须调用RasHangUp ,即使
连接未能建立。在调用RasHangUp 后应用程序不能立即退出,因为Remote
Access Connection Manager 需要时间结束连接。程序应在用RasGetConnectStatus
返回ERROR_INVALID_HANDLE时退出,这说明连接已经被删除了。
应用程序可能在调用RasDial建立连接后退出,此时,可以用RasEnumConnections
获取当前的所有连接,他返回一个RASCONN结构,其中有HRASCONN句柄及电话号码
等信息。
RAS Phone Books
Phone books提供一种标准的方法保存连接信息。Entry name与电话号码,COM
PORTS,modem设置相关。95中,phonebook entries 存在注册表。
可以使用RasCreatePhonebookEntry及RasEditPhonebookEntry创建及编辑
phone-book entry,并自动产生DIALOG。
还可以用RasGetEntryDialParams 与 RasSetEntryDialParams 设置与获取
特殊的信息。
RasEnumEntries 则可获取 RASENTRYNAME 结构数组,含有phone-book entry
名称。
Linking to the Remote Access DLL
如果一个APP静态连接到RASAPI32.DLL,而RAS没有安装,APP会失败。但
可以用LoadLibrary 来装载 DLL, 用GetProcAddress获取指向RAS函数的指针。
必须包含头文件:RAS.H RASERROR.H
在project/setting的object/labrary modules添加rasapi32.lib则可解决连接错误。
几篇文章,但对基本的原理说明不是很详细,对于我这样一个菜鸟而言似乎
不易懂,因此只好翻译了MSDN的部分内容并补充了一点点,具体的统计流量
请参考VCHELP上的文章,本文仅供大家参考,避免
重复工作。
----------------------
RAS使用RasDial函数开始建立连接,建立后由Remote Access
Connection Manager接管。Remote Access Connection Manager
处理建立连接的details,并提供client连接操作的状态信息。
当应用程序load RASAPI32.DLL时,自动启动Remote Access
Connection Manager。
RasDial开始建立连接时,需要定义以下信息:
连接信息:用于建立连接;
notification handler(可选的):在连接过程中获取连接消息;
RASDIALEXTENSIONS结构(可选的):一个扩展,允许或禁止扩展功能(如
允许client直接使用modem的一些设置,控制RAS使用phonebook entry中的
前缀或后缀,在连接操作中支持paused status。
同步操作
当RasDial作为同步调用时,函数直到连接建立或产生错误时才返回。
主要缺点在于不能获得连接过程的状态信息。
异步操作
异步时,必须指明一个notification handler,他可以是一个接受消息的
窗口,也可是回调函数——RasDialFunc, RasDialFunc1, or RasDialFunc2
。如同步操作一样,在发生错误时必须关闭连接操作。
Phonebook 文件以及连接信息
为了建立连接,RasDial必须指明连接信息,通过phone-book entry(包括
电话号码,BPS,用户验证信息和其他连接信息)。
为了显示phonebook entries的列表,RAS client可以用RasEnumEntries函数
来列举。如果不使用phonebook entry,则调用RasDial时将szEntryName
(RASDIALPARAMS结构成员)设为空字符串,而RASDIALPARAMS.szPhoneNumber
必须包含拨号号码,这时Remote Access Connection Manager使用第一个可用
的modem port以及其他设置的缺省值。
用户验证信息
RAS client用RASDIALPARAMS结构(RasDial)定义用户名及密码,否则
Remote Access Connection Manager使用当前登陆的用户名及密码。
如果不能登陆,则允许连接操作进入paused state,使用户重新确定验证信息。
其他连接信息
RASDIALPARAMS结构还包括以下连接信息:
代替phonebook entry号码的电话号码;
一个提供给server call back的号码(缺省为no callback);
The name of the remote network domain on which the authentication
is to occur。
连接状态
enum RASCONNSTATE设置了一组与连接状态相应的值。连接状态分为三组:
运行态:连接设备,验证用户,等待server callback。RAS client不提供
操作,仅将notification提供给用户直到发生错误。
Paused states:暂停连接操作,获得新的用户名或密码等信息。
Terminal states:发生在连接成功建立时、连接操作失败或调用RasHangUp
也可使用RasGetConnectStatus来获取当前连接状态。
Notification Handlers
一个Notification Handlers可处理的操作如下:
1、处理错误,此时应当调用RasHangUp结束连接,可用RasGetErrorString获得错误
描述;
2、提供链接状态,对于notification handler并不需要采取任何操作,除非产生
错误,可用RasGetConnectStatus来获得设备名及类型(in RASCS_ConnectDevice
notification call it),用RasGetProjectionInfo(in RASCS_Projected
notification)获得如连接的网络协议;
3、处理paused states,缺省时paused state is disabled,如果要支持则设置
RDEOPTS_PausedStates 标记( in the RASDIALEXTENSIONS structure),
当paused state产生时,Remote Access Connection Manager激活notification
handler ,如果paused state is disabled,则在notification message 指明
出错,并且连接失败,如果支持paused state,则暂停连接等待用户相应,客户
可以第二次调用RasDial来恢复连接(第二次调用要指明一些信息,The
connection handle that was returned by the original RasDial call.
The same notification handler as the original RasDial call.
The user's input in the appropriate members of the RASDIALPARAMS
structure. Other members of the RASDIALPARAMS structure should have
the same information as specified in the original RasDial call.
,而且不能从notification handler调用),或RasHangUp终止连接;
4、连接操作结束时,告知用户,发生在以下情况:a.连接建立,接受
RASCS_Connected,客户程序可以退出而不断开连接 b.发生错误,获取错误及
连接状态 c.由RasHangUp断开。
有三种handler,接受同样的信息:当前的连接状态及错误号。
RasDialFunc:仅接受当前连接态与错误码;
RasDialFunc1:可以接受连接句柄HRASCONN及扩展错误信息,该参数可用于支持
多个同时发生的连接操作;
Window handle:一个窗口句柄,RAS送WM_RASDIALEVENT消息(含有连接状态与错
误码),通常应用于16位WINDOWS,因他不支持回调函数。
Remote Access Connection Manager 悬挂起连接操作直到notification handler
返回,因此handler必须尽快返回。
一些可在handler中调用的函数: (RasGetConnectStatus, RasEnumEntries,
RasEnumConnections, RasGetErrorString, and RasHangUp)
Disconnecting
当用户开始连接操作时,RasDial接受连接句柄HRASCONN,如果该句柄非NULL
则可用RasHangUp结束连接。如果发生错误时则必须调用RasHangUp ,即使
连接未能建立。在调用RasHangUp 后应用程序不能立即退出,因为Remote
Access Connection Manager 需要时间结束连接。程序应在用RasGetConnectStatus
返回ERROR_INVALID_HANDLE时退出,这说明连接已经被删除了。
应用程序可能在调用RasDial建立连接后退出,此时,可以用RasEnumConnections
获取当前的所有连接,他返回一个RASCONN结构,其中有HRASCONN句柄及电话号码
等信息。
RAS Phone Books
Phone books提供一种标准的方法保存连接信息。Entry name与电话号码,COM
PORTS,modem设置相关。95中,phonebook entries 存在注册表。
可以使用RasCreatePhonebookEntry及RasEditPhonebookEntry创建及编辑
phone-book entry,并自动产生DIALOG。
还可以用RasGetEntryDialParams 与 RasSetEntryDialParams 设置与获取
特殊的信息。
RasEnumEntries 则可获取 RASENTRYNAME 结构数组,含有phone-book entry
名称。
Linking to the Remote Access DLL
如果一个APP静态连接到RASAPI32.DLL,而RAS没有安装,APP会失败。但
可以用LoadLibrary 来装载 DLL, 用GetProcAddress获取指向RAS函数的指针。
必须包含头文件:RAS.H RASERROR.H
在project/setting的object/labrary modules添加rasapi32.lib则可解决连接错误。