求助,RAS的API如何获得一个正在断开的连接是否已完全断开?

rienzi 2010-01-20 10:01:21
事情是这样的:

偶的机器上插着3G上网卡,偶用RAS的API实现了程序启动时自动拨号的功能,现在偶要在偶的程序里加入连接断开后自动重新拨号的功能,开一个后台线程,隔一段时间用RasEnumConnections检测连接,如果检测出的连接没有,那个我想要连接的连接,那么就用RasDial进行重新连接,但是,现在问题来了:

如果在我拨号成功以后,用户右击右下角任务栏中的连接图标点击“断开”,那么要过一段时间这个连接才会断开,图标也消失,在这段时间里,我的程序不因为用RasEnumConnections找到的活动连接中没有正在断开的这个连接,所以后台进程自动进行重新连接,问题是,在用户点击“断开”但是连接还没有完全断开的这段时间里,用RasDial对其进行异步连接,用RasGetConnectionStatus对连接句柄进行状态检测,每次检测到的RASCONNSTATUS结构体的rasconnstate成员结果都是RASCS_Connected,即连接已成功。也就是说,在连接将要断开还未断开的时候检测连接状态就得到连接已成功的状态,如果据此结果返回给用户状态信息,用户就会被误导,觉得连接已成功!
虽然说我的后台程序是在不断用RasEnumConnections枚举已连接的连接,这样每隔一定时间没有找到要连接的连接即会进行重连,这样最终一定是会重连成功的,可是连接将要断开还未断开的途中根本无法返回给用户正确的状态信息,请问:如何检测到“正在断开”这个状态,枚举成员rasconnstate里面似乎没有有关“正在断开”这样一个状态的值,请问如何检测“正在断开”这个状态。


还有,请问如何让RasGetConnectionStatus得到的状态结构体的rasconnstate枚举成员返回RASCS_Disconnected,即已断开的结果?什么情况下能得到这个结果?因为RasGetConnectionStatus只能由连接句柄HRASCONN返回连接状态,而连接句柄只能由RasEnumConnections和RasDial这两个函数获得,可是这两个函数所获得的均是已连接或连接成功的连接的句柄,这样一来,不是根本无法获得已断开的连接的连接句柄了吗,因为我不能得到已断开的连接的连接句柄,所以我根本不可能让RasGetConnectionStatus返回RASCS_Disconnected状态啊!这样给了这样一个可能值还有什么意义呢?
请问诸位是不是RASCS_Disconnected这个值根本无法获得啊?还是说还有其他的API能返回这个值?如果有,望告知,获得“已断开”和“正在断开”这两个状态对我来说很重要,谢谢了!
补充:即使用RasHangUp将一个连接句柄挂断连接以后,再用RasGetConnectionStatus也是无法获得RASCS_Disconnected这个状态的!获得的只有RASCS_Connected,这不根本就是误导吗,不知道是不是ms的RAS函数这里出现了bug,真心求教!
...全文
320 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
rienzi 2010-01-27
  • 打赏
  • 举报
回复
楼上的说明大致明白了,但是如果是用户断开的连接的话,根本就不知道RasHangUp是什么时候返回的,因为不是由你来调用RasHangUp的,真是不知道这程序应该怎么写呀
我等了许久 2010-01-25
  • 打赏
  • 举报
回复
我也遇到过这样的问题,看看msdn的解释:
An application should not call RasHangUp and then immediately exit. The connection state machine needs time to properly terminate. If the system prematurely terminates the state machine, the state machine can fail to properly close a port, leaving the port in an inconsistent state. Also, an immediate attempt to use the same connection may fail leaving the connection unusable. A simple way to avoid these problems is to call Sleep(3000) after returning from RasHangUp; after that pause, the application can exit. A more responsive way to avoid these problems is, after returning from RasHangUp, to call RasGetConnectStatus(hrasconn) and Sleep(0) in a loop until RasGetConnectStatus returns ERROR_INVALID_HANDLE.

You can call RasHangUp on the handle returned by RasGetSubEntryHandle to terminate a single link in a multi-link connection. However, in this case, you cannot use RasGetConnectStatus to determine if the link terminated; RasGetConnectStatus may not return ERROR_INVALID_HANDLE even though the link terminated successfully.

我英语差看的不太懂。
rienzi 2010-01-22
  • 打赏
  • 举报
回复
断开过程中异步拨号的回调函数返回的RASCONNSTATE是RASCS_Connected即已连接,从来不会返回RASCS_Disconnected,返回的枚举值中也没有表示“正在断开”的值
rienzi 2010-01-22
  • 打赏
  • 举报
回复
不,不一定3至5秒,可能会有很长时间……
rienzi 2010-01-22
  • 打赏
  • 举报
回复
回5楼,大概有3至5秒,我要在这3至5秒时间里把线程挂起然后给用户显示:“正在断开”吗,可是没法确定具体应该挂起几秒呢,时间太长了不行,时间短了就有会把“正在断开”状态错显示成“已连接”状态。
jamesony 2010-01-22
  • 打赏
  • 举报
回复
正在断开至断开的这段时间有多长?正常情况下,我觉得这个状态应该加保护才对。。
wuhuwy 2010-01-21
  • 打赏
  • 举报
回复
帮顶,楼主的问题描述得太复杂了。。。
Conry 2010-01-21
  • 打赏
  • 举报
回复
异步拨号的回调函数也得不到消息吗
rienzi 2010-01-21
  • 打赏
  • 举报
回复
我就是想知道如何判断一个连接是否“正在断开”和“已断开”,没有哪位高手慷慨一下吗

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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