回 帖 发 新 帖 刷新版面

主题:[讨论]上网计时器算法的优化

关于上网计时器,比如“计时提醒王”这样的软件,我考虑了很长时间,但有些问题还是没想明白:

1、程序究竟是如何获得网络连接状态的(比如使用ADSL上网,关键是如何确定何时连接到了Internet,何时又断开了网络)

2、程序是如何实现系统时间被突然更改后仍能正常工作的(我的想法是只要用Timer控件计时,不用考虑系统时间就可以了,但是程序是要检查系统时间的,不知道这里边究竟有什么玄机)

关于以上两个问题,我的第一想法是用Timer控件不断刷新(比如不停地扫描网络状态)都可以实现,但问题是如果我把刷新时间改为1秒钟1次,岂不是很占用资源?

希望大家讨论一下,最好能附上源码~以方便交流

找到几个API,效率有没有区别,以及占用资源多少

发出两个API,也算资源共享了

Private Const INTERNET_CONNECTION_CONFIGURED = &H40
  Private Const INTERNET_CONNECTION_LAN = &H2
  Private Const INTERNET_CONNECTION_MODEM = &H1
  Private Const INTERNET_CONNECTION_OFFLINE = &H20
  Private Const INTERNET_CONNECTION_PROXY = &H4
  Private Const INTERNET_RAS_INSTALLED = &H10
  Private Declare Function InternetGetConnectedState Lib "wininet.dll" (ByRef lpdwFlags As Long, ByVal dwReserved As Long) As Long

Dim Ret As Long
          Me.AutoRedraw = True

 InternetGetConnectedState Ret, 0&
    'show   the   result
    If (Ret And INTERNET_CONNECTION_CONFIGURED) = INTERNET_CONNECTION_CONFIGURED Then Label1.Caption = "连接有效" Else Label1.Caption = "连接无效"
    If (Ret And INTERNET_CONNECTION_LAN) = INTERNET_CONNECTION_LAN Then Label2.Caption = "局域网"
    If (Ret And INTERNET_CONNECTION_MODEM) = INTERNET_CONNECTION_MODEM Then Label2.Caption = "调制解调器"
    If (Ret And INTERNET_CONNECTION_OFFLINE) = INTERNET_CONNECTION_OFFLINE Then Label4.Caption = "离线"
    If (Ret And INTERNET_CONNECTION_PROXY) = INTERNET_CONNECTION_PROXY Then Label5.Caption = "代理"
    If (Ret And INTERNET_RAS_INSTALLED) = INTERNET_RAS_INSTALLED Then Label6.Caption = "远程访问服务"

==========================================
'Example created by Tolis Bekiaris (tolisss@hotmail.com)
Private Declare Function RasEnumConnections Lib "rasapi32" Alias "RasEnumConnectionsA" (ByVal lprasconn As Long, ByVal lpcb As Long, ByVal lpcConnections As Long) As Long
Private Declare Function RasGetConnectionStatistics Lib "rasapi32" (ByVal hRasConn As Long, ByVal lpStatistics As Long) As Long
Private Type RASCONN
    dwSize As Long
    hRasConn As Long
    szEntryName(0 To 256) As Byte
    szDeviceType(0 To 16) As Byte
    szDeviceName(0 To 128) As Byte
    pad As Byte
End Type
Private Type RAS_STATS
    dwSize As Long
    dwBytesXmited As Long
    dwBytesRcved As Long
    dwFramesXmited As Long
    dwFramesRcved As Long
    dwCrcErr As Long
    dwTimeoutErr As Long
    dwAlignmentErr As Long
    dwHardwareOverrunErr As Long
    dwFramingErr As Long
    dwBufferOverrunErr As Long
    dwCompressionRatioIn As Long
    dwCompressionRatioOut As Long
    dwBps As Long
    dwConnectDuration As Long
End Type
Private Sub Form_Load()
    Dim conn As RASCONN
    Dim stat As RAS_STATS
    Dim y As Long, z As Long
        
    conn.dwSize = Len(conn)
    y = conn.dwSize
    
    
    If RasEnumConnections(VarPtr(conn), VarPtr(y), VarPtr(z)) = 0 Then
        stat.dwSize = Len(stat)
        If RasGetConnectionStatistics(conn.hRasConn, VarPtr(stat)) = 0 Then
            Debug.Print stat.dwAlignmentErr
            Debug.Print stat.dwBps
            Debug.Print stat.dwBufferOverrunErr
            Debug.Print stat.dwBytesRcved
            Debug.Print stat.dwBytesXmited
            Debug.Print stat.dwCompressionRatioIn
            Debug.Print stat.dwCompressionRatioOut
            Debug.Print stat.dwConnectDuration
            Debug.Print stat.dwCrcErr
            Debug.Print stat.dwFramesRcved
            Debug.Print stat.dwFramesXmited
            Debug.Print stat.dwFramingErr
            Debug.Print stat.dwTimeoutErr
        End If
    End If
    
End Sub

回复列表 (共14个回复)

11 楼

我看了下,也试了下.有连接后的状态回调,就是找不到断开连接时的回调.

12 楼

[quote]我看了下,也试了下.有连接后的状态回调,就是找不到断开连接时的回调[/quote]

那请把您找到的连接后的回调发出来吧,突然想到一个新思路……多谢啦!

13 楼

再看了下,可以多创建一个线程监视连接终止!~

14 楼

请把回调的函数发出来行么?谢谢!

我来回复

您尚未登录,请登录后再回复。点此登录或注册