请问用什么方法(或者控件)可以检测 是否已经连接到网络(Internet)?谢谢了!!!急!

解决方案 »

  1.   

    通过PING一个INTERNET地址来知道是否连接。Private Const IP_SUCCESS As Long = 0
    Private Const IP_STATUS_BASE As Long = 11000
    Private Const IP_BUF_TOO_SMALL As Long = (11000 + 1)
    Private Const IP_DEST_NET_UNREACHABLE As Long = (11000 + 2)
    Private Const IP_DEST_HOST_UNREACHABLE As Long = (11000 + 3)
    Private Const IP_DEST_PROT_UNREACHABLE As Long = (11000 + 4)
    Private Const IP_DEST_PORT_UNREACHABLE As Long = (11000 + 5)
    Private Const IP_NO_RESOURCES As Long = (11000 + 6)
    Private Const IP_BAD_OPTION As Long = (11000 + 7)
    Private Const IP_HW_ERROR As Long = (11000 + 8)
    Private Const IP_PACKET_TOO_BIG As Long = (11000 + 9)
    Private Const IP_REQ_TIMED_OUT As Long = (11000 + 10)
    Private Const IP_BAD_REQ As Long = (11000 + 11)
    Private Const IP_BAD_ROUTE As Long = (11000 + 12)
    Private Const IP_TTL_EXPIRED_TRANSIT As Long = (11000 + 13)
    Private Const IP_TTL_EXPIRED_REASSEM As Long = (11000 + 14)
    Private Const IP_PARAM_PROBLEM As Long = (11000 + 15)
    Private Const IP_SOURCE_QUENCH As Long = (11000 + 16)
    Private Const IP_OPTION_TOO_BIG As Long = (11000 + 17)
    Private Const IP_BAD_DESTINATION As Long = (11000 + 18)
    Private Const IP_ADDR_DELETED As Long = (11000 + 19)
    Private Const IP_SPEC_MTU_CHANGE As Long = (11000 + 20)
    Private Const IP_MTU_CHANGE As Long = (11000 + 21)
    Private Const IP_UNLOAD As Long = (11000 + 22)
    Private Const IP_ADDR_ADDED As Long = (11000 + 23)
    Private Const IP_GENERAL_FAILURE As Long = (11000 + 50)
    Private Const MAX_IP_STATUS As Long = (11000 + 50)
    Private Const IP_PENDING As Long = (11000 + 255)
    Private Const PING_TIMEOUT As Long = 500
    Private Const WS_VERSION_REQD As Long = &H101
    Private Const MIN_SOCKETS_REQD As Long = 1
    Private Const SOCKET_ERROR As Long = -1
    Private Const INADDR_NONE As Long = &HFFFFFFFF
    Private Const MAX_WSADescription As Long = 256
    Private Const MAX_WSASYSStatus As Long = 128Public PingTime As Long
    Private Type ICMP_OPTIONS
        Ttl             As Byte
        Tos             As Byte
        Flags           As Byte
        OptionsSize     As Byte
        OptionsData     As Long
    End TypePrivate Type ICMP_ECHO_REPLY
        Address         As Long
        status          As Long
        RoundTripTime   As Long
        DataSize        As Long
        DataPointer     As Long
        Options         As ICMP_OPTIONS
        Data            As String * 250
    End TypePrivate Type WSADATA
       wVersion As Integer
       wHighVersion As Integer
       szDescription(0 To MAX_WSADescription) As Byte
       szSystemStatus(0 To MAX_WSASYSStatus) As Byte
       wMaxSockets As Long
       wMaxUDPDG As Long
       dwVendorInfo As Long
    End TypePublic Declare Function timeGetTime Lib "winmm.dll" () As Long
    Private Declare Function WSAStartup Lib "wsock32" (ByVal wVersionRequired As Long, lpWSADATA As WSADATA) As Long
    Private Declare Function WSACleanup Lib "wsock32" () As Long
    Private Declare Function IcmpCreateFile Lib "icmp.dll" () As Long
    Private Declare Function inet_addr Lib "wsock32" (ByVal s As String) As Long
    Private Declare Function IcmpCloseHandle Lib "icmp.dll" (ByVal IcmpHandle As Long) As Long
    Private Declare Function IcmpSendEcho Lib "icmp.dll" (ByVal IcmpHandle As Long, ByVal DestinationAddress As Long, ByVal RequestData As String, ByVal RequestSize As Long, ByVal RequestOptions As Long, ReplyBuffer As ICMP_ECHO_REPLY, ByVal ReplySize As Long, ByVal Timeout As Long) As Long
       
    Private Function GetStatusCode(status As Long) As String
       On Error GoTo ErrLine
       Dim Msg As String
       GetStatusCode = ""
       Select Case status
                Case IP_SUCCESS:               Msg = "ip success"
                Case INADDR_NONE:              Msg = "inet_addr: bad IP format"
                Case IP_BUF_TOO_SMALL:         Msg = "ip buf too_small"
                Case IP_DEST_NET_UNREACHABLE:  Msg = "ip dest net unreachable"
                Case IP_DEST_HOST_UNREACHABLE: Msg = "ip dest host unreachable"
                Case IP_DEST_PROT_UNREACHABLE: Msg = "ip dest port unreachable"
                Case IP_DEST_PORT_UNREACHABLE: Msg = "ip dest port unreachable"
                Case IP_NO_RESOURCES:          Msg = "ip no resources"
                Case IP_BAD_OPTION:            Msg = "ip bad option"
                Case IP_HW_ERROR:              Msg = "ip hw_error"
                Case IP_PACKET_TOO_BIG:        Msg = "ip packet too_big"
                Case IP_REQ_TIMED_OUT:         Msg = "ip req timed out"
                Case IP_BAD_REQ:               Msg = "ip bad req"
                Case IP_BAD_ROUTE:             Msg = "ip bad route"
                Case IP_TTL_EXPIRED_TRANSIT:   Msg = "ip ttl expired transit"
                Case IP_TTL_EXPIRED_REASSEM:   Msg = "ip ttl expired reassem"
                Case IP_PARAM_PROBLEM:         Msg = "ip param_problem"
                Case IP_SOURCE_QUENCH:         Msg = "ip source quench"
                Case IP_OPTION_TOO_BIG:        Msg = "ip option too_big"
                Case IP_BAD_DESTINATION:       Msg = "ip bad destination"
                Case IP_ADDR_DELETED:          Msg = "ip addr deleted"
                Case IP_SPEC_MTU_CHANGE:       Msg = "ip spec mtu change"
                Case IP_MTU_CHANGE:            Msg = "ip mtu_change"
                Case IP_UNLOAD:                Msg = "ip unload"
                Case IP_ADDR_ADDED:            Msg = "ip addr added"
                Case IP_GENERAL_FAILURE:       Msg = "ip general failure"
                Case IP_PENDING:               Msg = "ip pending"
                Case PING_TIMEOUT:             Msg = "ping timeout"
                Case Else:                     Msg = "unknown msg returned"
       End Select
       GetStatusCode = Msg
       Exit Function
    ErrLine:
    End FunctionPrivate Function Ping(sAddress As String, sDataToSend As String, ECHO As ICMP_ECHO_REPLY) As Long
       On Error GoTo ErrLine
       Dim hPort As Long
       Dim dwAddress As Long
       dwAddress = inet_addr(sAddress)
       If dwAddress <> INADDR_NONE Then
          hPort = IcmpCreateFile()
          If hPort Then
             Call IcmpSendEcho(hPort, dwAddress, sDataToSend, Len(sDataToSend), 0, ECHO, Len(ECHO), PING_TIMEOUT)
             Ping = ECHO.status
             Call IcmpCloseHandle(hPort)
          End If
       Else
          Ping = INADDR_NONE
       End If
       Exit Function
    ErrLine:
       Ping = INADDR_NONE
    End FunctionPublic Function PingIP(ByVal szIp As String) As Boolean
    On Error GoTo ErrLine
    Dim WSAD As WSADATA
    Dim ECHO As ICMP_ECHO_REPLY
    Dim ret As Long
    Delay 150
    PingIP = False
    PingTime = Empty
    If WSAStartup(WS_VERSION_REQD, WSAD) = IP_SUCCESS Then
       ret = Ping(Trim(szIp), "tanaya", ECHO)
       PingTime = ECHO.RoundTripTime
       If InStr(1, GetStatusCode(ret), "success") <> 0 Then
          WSACleanup
          PingIP = True
          PingTime = ECHO.RoundTripTime
          Exit Function
        End If
    End If
    Exit Function
    ErrLine:
    End FunctionPrivate Function Delay(MSceond As Long)
    Dim I As Long
    If MSceond < 5 Then Exit Function
    I = timeGetTime
    Do While timeGetTime - I < MSceond
       DoEvents
    Loop
    End Function可以把上面的这一段放在一个模块里面去。在窗体中放一个按钮,调用测试:
    sub command1_click
    if PingIp("202.94.14.23") then
       msgbox"Connected, Pingtime:" & PingTime
    else
       Msgbox"Disconnect"
    end if
    end sub
      

  2.   

    给你个简单的,但不保证其在任何情况下都正确有效Private Declare Function IsNetworkAlive Lib "SENSAPI.DLL" (ByRef lpdwFlags As Long) As LongPrivate Sub Form_Load()
        Dim Ret As Long
        If IsNetworkAlive(Ret) = 0 Then
            MsgBox "无网络连接"
        Else
            MsgBox "网络连接"
        End If
    End Sub
      

  3.   

    楼上的没用用checkadsl 就行了,保证有用
    Public Declare Function RasEnumConnections Lib "RasApi32.dll" Alias "RasEnumConnectionsA" (lpRasCon As Any, lpcb As Long, lpcConnections As Long) As Long
    Public Declare Function RasGetConnectStatus Lib "RasApi32.dll" Alias "RasGetConnectStatusA" (ByVal hRasCon As Long, lpStatus As Any) As LongPublic Const RAS95_MaxEntryName = 256Public Const RAS95_MaxDeviceType = 16Public Const RAS95_MaxDeviceName = 32Public Type RASCONN95dwSize As LonghRasCon As LongszEntryName(RAS95_MaxEntryName) As ByteszDeviceType(RAS95_MaxDeviceType) As ByteszDeviceName(RAS95_MaxDeviceName) As ByteEnd TypePublic Type RASCONNSTATUS95dwSize As LongRasConnState As LongdwError As LongszDeviceType(RAS95_MaxDeviceType) As ByteszDeviceName(RAS95_MaxDeviceName) As ByteEnd Type
    Public Function isdial() As Boolean
    Dim TRasCon(255) As RASCONN95Dim lg As LongDim lpcon As LongDim RetVal As LongDim Tstatus As RASCONNSTATUS95'TRasCon(0).dwSize = 412lg = 256 * TRasCon(0).dwSize'RetVal = RasEnumConnections(TRasCon(0), lg, lpcon)If RetVal <> 0 ThenMsgBox "产生错误!", vbInformation, "提示"Exit FunctionEnd If
    'Tstatus.dwSize = 160RetVal = RasGetConnectStatus(TRasCon(0).hRasCon, Tstatus)If Tstatus.RasConnState = &H2000 Then
    isdial = True
    Else
    isdial = False
    End If
    End Function
    Function checkadsl()
    If isdial Then
    MsgBox "已连接到Internet!", vbInformation, "提示"
    Else
    MsgBox "未连接到Internet!", vbInformation, "提示"
    End If
    End Function
      

  4.   

    智能化简单的方法保证有用:
    Private Declare Function IsNetworkAlive Lib "SENSAPI.DLL" (Optional ByRef lpdwFlags As Long) As Long
    Private Sub Command1_Click()
        If IsNetworkAlive() = 0 Then
            MsgBox "无网络连接"
        Else
            MsgBox "网络连接"
        End If
    End Sub
      

  5.   

    Public Declare Function InternetGetConnectedState Lib "wininet.dll" _
        (ByRef lpdwFlags As Long, ByVal dwReserved As Long) As LongPublic Function IsNetConnectOnline() As Boolean   IsNetConnectOnline = InternetGetConnectedState(0&, 0&)
         
    End Function准备接分!
      

  6.   

    真是谢谢大家,CSDN的大家庭太温暖了,呵呵!程序员的家哦!呵呵!
      

  7.   

    好了,所有的方法我都试过了,给大家一个结论:
       第一种最长的方法是最有效的,因为他通过PING来实现,可是,用来做测试的202.94.14.23,出现的是Reply from 210.74.176.246: TTL expired in transit.可是MSG返回的不是IP_SUCCESS,所以仍然出现Disconnect,可以使用SINA的61.172.201.14做测试。或者通过PingTime来判断。感谢WallesCai(最奢侈的事就是睡觉了,偶好想睡觉哦.女朋友可以不找,饭可以不吃,偶把时间都换成睡眠吧.) 
        chewinggum(口香糖·把减肥列入下一个五年计划) 
         xiaoyaolz(逍遥浪子)的简单方法
        采用直接使用API,但是我发现,当连接网络后,再断网,仍然会显示Connect,所以有一点问题。
        另外, xiaoyaolz(逍遥浪子)提供了另外一种方法,好象对我并不适用,因为不是ADSL!
        再次感谢WallesCai (5)、 chewinggum (5)、 xiaoyaolz (5)、 zhhlong (5)、 的帮助!:)