jieelin 发表于 2009-6-1 09:32:04

请教如何判断网络是否断线?

因为我所用的网络是一个公司的内部网,需要认证才可以上互联网,但是这个认证有时不是很稳定,时不时掉线,我想请教一下如何在AUTOIT里判断网络是否断线? 谢谢!

lynfr8 发表于 2009-6-1 11:17:56

给个思路,可以放到一个循环定时检测#include <inet.au3>
dim $var
      $var = Ping ("www.baidu.com",250)
      If $var Then
                        TrayTip('',"联网",5,1)
                        Sleep(5000)

      Else
                TrayTip('',"断网",5,1)
                Sleep(5000)
       
      EndIf

jieelin 发表于 2009-6-1 11:33:01

在网上找到一个VB写的程序,不过小弟对VB一窍不通,不知道有没有哪位高手可以改用AUTOIT重写一下,,谢谢!

拨号、断网、枚举连接名称,
判断是否在线、连接方式。   
http://blog.csdn.net/Modest/archive/2006/10/20/1342633.aspx   
   
Option   Explicit   
'拨号/断网   
Private   Declare   Function   InternetDial   Lib   "wininet.dll"   (ByVal   hwndParent   As   Long,   ByVal   lpszConnectoid   As   String,   ByVal   dwFlags   As   Long,   lpdwConnection   As   Long,   ByVal   dwReserved   As   Long)   As   Long   
Private   Declare   Function   InternetHangUp   Lib   "wininet.dll"   (ByVal   dwConnection   As   Long,   ByVal   dwReserved   As   Long)   As   Long   
Private   Declare   Function   InternetAutodial   Lib   "wininet.dll"   (ByVal   dwFlags   As   Long,   ByVal   dwReserved   As   Long)   As   Long   
Private   Declare   Function   InternetAutodialHangup   Lib   "wininet.dll"   (ByVal   dwReserved   As   Long)   As   Long   
Private   Const   INTERNET_DIALSTATE_DISCONNECTED   =   1   
Private   Const   INTERNET_AUTODIAL_FORCE_ONLINE   =   1   
Private   Const   INTERNET_AUTODIAL_FORCE_UNATTENDED   =   2   
Private   Const   INTERNET_DIAL_UNATTENDED   =   &H8000   
Private   Handle   As   Long   
   
'网络状态   
Private   Declare   Function   InternetGetConnectedStateEx   Lib   "wininet.dll"   Alias   "InternetGetConnectedStateExA"   (ByRef   lpdwFlags   As   Long,   ByVal   lpszConnectionName   As   String,   ByVal   dwNameLen   As   Long,   ByVal   dwReserved   As   Long)   As   Long   
Private   Declare   Function   InternetGetConnectedState   Lib   "wininet.dll"   (ByRef   dwFlags   As   Long,   ByVal   dwReserved   As   Long)   As   Long   
Private   Const   INTERNET_CONNECTION_MODEM   As   Long   =   &H1             '本系统使用调制解调器与因特网相连   
Private   Const   INTERNET_CONNECTION_LAN   As   Long   =   &H2               '本系统通过LAN与因特网相连   
Private   Const   INTERNET_CONNECTION_PROXY   As   Long   =   &H4             '本系统使用proxy代理服务器与因特网相连   
Private   Const   INTERNET_CONNECTION_MODEM_BUSY   As   Long   =   &H8   '未使用   
Private   Const   INTERNET_RAS_INSTALLED   As   Long   =   &H10   
Private   Const   INTERNET_CONNECTION_OFFLINE   As   Long   =   &H20   
Private   Const   INTERNET_CONNECTION_CONFIGURED   As   Long   =   &H40   
   
'枚举网络连接   
Private   Const   RAS_MaxDeviceType   =   16   
Private   Const   RAS95_MaxDeviceName   =   128   
Private   Const   RAS95_MaxEntryName   =   256   
Private   Type   RASCONN95   
          dwSize   As   Long   
          hRasConn   As   Long   
          szEntryName(RAS95_MaxEntryName)   As   Byte   
          szDeviceType(RAS_MaxDeviceType)   As   Byte   
          szDeviceName(RAS95_MaxDeviceName)   As   Byte   
End   Type   
Private   Type   RASENTRYNAME95   
          dwSize   As   Long   
          szEntryName(RAS95_MaxEntryName)   As   Byte   
End   Type   
Private   Declare   Function   RasEnumConnections   Lib   "rasapi32.dll"   Alias   "RasEnumConnectionsA"   (lprasconn   As   Any,   lpcb   As   Long,   lpcConnections   As   Long)   As   Long   
Private   Declare   Function   RasEnumEntries   Lib   "rasapi32.dll"   Alias   "RasEnumEntriesA"   (ByVal   reserved   As   String,   ByVal   lpszPhonebook   As   String,   lprasentryname   As   Any,   lpcb   As   Long,   lpcEntries   As   Long)   As   Long   
Private   Declare   Function   RasHangUp   Lib   "rasapi32.dll"   Alias   "RasHangUpA"   (ByVal   hRasConn   As   Long)   As   Long   
   
'拨号   
Public   Function   DialUp(LinkName   As   String)   As   Boolean   
          InternetDial   0,   LinkName,   INTERNET_AUTODIAL_FORCE_UNATTENDED,   Handle,   0   
          DialUp   =   (Handle   <>   0)   
End   Function   
'断网   
Public   Sub   HangUp()   
          If   Handle   <>   0   Then   
                  InternetHangUp   Handle,   0   
                  Handle   =   0   
          End   If   
End   Sub   
   
   
'枚举网络连接   
Public   Sub   EnumConnectName(Value()   As   String)   
          Dim   s   As   Long,   l   As   Long,   ln   As   Long,   a   As   String   
          ReDim   r(255)   As   RASENTRYNAME95   
   
          r(0).dwSize   =   264   
          s   =   256   *   r(0).dwSize   
          l   =   RasEnumEntries(vbNullString,   vbNullString,   r(0),   s,   ln)   
          ReDim   Value(ln   -   1)   
          For   l   =   0   To   ln   -   1   
                  a   =   StrConv(r(l).szEntryName(),   vbUnicode)   
                  Value(l)   =   Left$(a$,   InStr(a$,   Chr$(0))   -   1)   
          Next   
End   Sub   
   
'判断是否在线   
Public   Function   Online()   As   Boolean   
          Online   =   InternetGetConnectedState(0&,   0&)   
End   Function   
'判断是否在线并返回连接方式   
Public   Property   Get   OnlineOfLinkName(LinkName   As   String)   As   Boolean   
          LinkName   =   Space$(128)   
          OnlineOfLinkName   =   InternetGetConnectedStateEx(0,   LinkName,   128,   0&)   
End   Property   
   
'如果是通过LAN的连接,则返回True   
Public   Function   IsNetConnectViaLAN()   As   Boolean   
          Dim   dwFlags   As   Long   
          Call   InternetGetConnectedState(dwFlags,   0&)   
          IsNetConnectViaLAN   =   dwFlags   And   INTERNET_CONNECTION_LAN   
End   Function   
'如果是通过调制解调器的连接,则返回True   
Public   Function   IsNetConnectViaModem()   As   Boolean   
          Dim   dwFlags   As   Long   
          Call   InternetGetConnectedState(dwFlags,   0&)   
          IsNetConnectViaModem   =   dwFlags   And   INTERNET_CONNECTION_MODEM   
End   Function   
'如果是通过Proxy代理服务器的连接,则返回True   
Public   Function   IsNetConnectViaProxy()   As   Boolean   
          Dim   dwFlags   As   Long   
          Call   InternetGetConnectedState(dwFlags,   0&)   
          IsNetConnectViaProxy   =   dwFlags   And   INTERNET_CONNECTION_PROXY   
End   Function   
'如果已安装了RAS,则返回True   
Public   Function   IsNetRASInstalled()   As   Boolean   
          Dim   dwFlags   As   Long   
          Call   InternetGetConnectedState(dwFlags,   0&)   
          IsNetRASInstalled   =   dwFlags   And   INTERNET_RAS_INSTALLED   
End   Function   
'返回当前网络状态信息字符串   
Public   Function   GetNetConnectString()   As   String   
          Dim   dwFlags   As   Long   
          Dim   msg   As   String   
          If   InternetGetConnectedState(dwFlags,   0&)   Then   
                  If   dwFlags   And   INTERNET_CONNECTION_CONFIGURED   Then   
                        msg   =   msg   &   "系统配置了网络连接"   &   vbCrLf   
                  End   If   
                  If   dwFlags   And   INTERNET_CONNECTION_LAN   Then   
                        msg   =   msg   &   "系统通过局域网与因特网相连接"   
                  End   If   
                  If   dwFlags   And   INTERNET_CONNECTION_PROXY   Then   
                        msg   =   msg   &   "并使用了Proxy代理服务"   
                  Else:   msg   =   msg   &   "."   
                  End   If   
                  If   dwFlags   And   INTERNET_CONNECTION_MODEM   Then   
                        msg   =   msg   &   "系统使用调制解调器与因特网相连接"   
                  End   If   
                  If   dwFlags   And   INTERNET_CONNECTION_OFFLINE   Then   
                        msg   =   msg   &   "系统当前处于离线状态"   
                  End   If   
                  If   dwFlags   And   INTERNET_CONNECTION_MODEM_BUSY   Then   
                        msg   =   msg   &   "系统的调制解调器未连接到因特网"   
                  End   If   
                  If   dwFlags   And   INTERNET_RAS_INSTALLED   Then   
                        msg   =   msg   &   "本系统安装了远程访问服务"   
                  End   If   
          Else   
                  msg   =   "当前未与因特网相连"   
          End   If   
          GetNetConnectString   =   msg   
End   Function

lynfr8 发表于 2009-6-1 12:13:12

就你提问的问题而言
哪用的上这么复杂啊
au3就是解放双手
这样搞下不是将简单的事情变复杂了

sensel 发表于 2009-6-1 14:32:53

2楼的代码是拨号用的吧?公司内部网的电脑用拨号?

星雨朝霞 发表于 2010-1-9 17:34:50

2楼的代码不错!!精典!!!可能判断当前网络是否连通

jycel 发表于 2010-1-11 12:49:36

用AdlibRegister调用检测!

ceoguang 发表于 2010-1-11 12:55:11

http://www.autoitx.com/forum.php?mod=viewthread&tid=934&highlight=%CD%F8%C2%E7

pusofalse 发表于 2010-1-11 14:26:04

用While ... WEnd/For ... Next / Do...Until/ AdlibRegister,如此循环的方式检测是否断线,显然在1000次检测中,最少有999次是多余的,只有1次检测是有意义的,程序执行过程中,总是将效率与资源浪费在那999次毫无意义的判断中,不必说现在的内存与CPU性能有多好。
但为了确保程序能够实时感知到线路状态,不得不采用循环检测的方式?
页: [1]
查看完整版本: 请教如何判断网络是否断线?