VB中怎样检测是否在线,越简单越好

解决方案 »

  1.   

    使用inet控件
    Option ExplicitPrivate Sub Command1_Click()
        Command1.Enabled = False
        txStatus.Text = ""    If Len(Inet1.OpenURL("http://www.hinet.net")) <> 0 Or _
            Len(Inet1.OpenURL("http://www.altavista.com")) <> 0 Or _
            Len(Inet1.OpenURL("http://www.microsoft.com")) <> 0 Then
            
            txStatus.Text = "已经与 Internet 连接"
        Else
            txStatus.Text = "尚未与 Internet 连接"
        End If
        
        Command1.Enabled = True
    End Sub
      

  2.   

    使用pingOption ExplicitPrivate Declare Function IcmpCreateFile Lib "icmp.dll" () 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 Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As Long
    Private Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal wVersionRequired As Long, lpWSADATA As WSADATA) As Long
    Private Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long'  ICMP返回的报文信息常数和Winsock版本等相关常数
    Private Const IP_STATUS_BASE = 11000
    Private Const IP_SUCCESS = 0
    Private Const IP_BUF_TOO_SMALL = (11000 + 1)
    Private Const IP_DEST_NET_UNREACHABLE = (11000 + 2)
    Private Const IP_DEST_HOST_UNREACHABLE = (11000 + 3)
    Private Const IP_DEST_PROT_UNREACHABLE = (11000 + 4)
    Private Const IP_DEST_PORT_UNREACHABLE = (11000 + 5)
    Private Const IP_NO_RESOURCES = (11000 + 6)
    Private Const IP_BAD_OPTION = (11000 + 7)
    Private Const IP_HW_ERROR = (11000 + 8)
    Private Const IP_PACKET_TOO_BIG = (11000 + 9)
    Private Const IP_REQ_TIMED_OUT = (11000 + 10)
    Private Const IP_BAD_REQ = (11000 + 11)
    Private Const IP_BAD_ROUTE = (11000 + 12)
    Private Const IP_TTL_EXPIRED_TRANSIT = (11000 + 13)
    Private Const IP_TTL_EXPIRED_REASSEM = (11000 + 14)
    Private Const IP_PARAM_PROBLEM = (11000 + 15)
    Private Const IP_SOURCE_QUENCH = (11000 + 16)
    Private Const IP_OPTION_TOO_BIG = (11000 + 17)
    Private Const IP_BAD_DESTINATION = (11000 + 18)
    Private Const IP_ADDR_DELETED = (11000 + 19)
    Private Const IP_SPEC_MTU_CHANGE = (11000 + 20)
    Private Const IP_MTU_CHANGE = (11000 + 21)
    Private Const IP_UNLOAD = (11000 + 22)
    Private Const IP_ADDR_ADDED = (11000 + 23)
    Private Const IP_GENERAL_FAILURE = (11000 + 50)
    Private Const MAX_IP_STATUS = 11000 + 50
    Private Const IP_PENDING = (11000 + 255)
    Private Const PING_TIMEOUT = 200
    Private Const WS_VERSION_REQD = &H101
    Private Const WS_VERSION_MAJOR = WS_VERSION_REQD \ &H100 And &HFF&
    Private Const WS_VERSION_MINOR = WS_VERSION_REQD And &HFF&
    Private Const MIN_SOCKETS_REQD = 1
    Private Const SOCKET_ERROR = -1
    Private Const MAX_WSADescription = 256
    Private Const MAX_WSASYSStatus = 128'   ICMP选项结构
    Private Type ICMP_OPTIONS
        Ttl             As Byte
        Tos             As Byte
        Flags           As Byte
        OptionsSize     As Byte
        OptionsData     As Long
    End Type'   ICMP应答结构
    Private 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 Type'  存放Winsock版本等信息的结构
    Private 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 TypeDim ICMPOPT As ICMP_OPTIONS'  返回状态信息
    Private Function GetStatusCode(status As Long) As String
       Dim msg As String
       Select Case status
          Case IP_SUCCESS:               msg = "ip success"
          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 prot 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 = CStr(status) & "   [ " & msg & " ]"
    End Function'  获得一个整数的高字节位
    Private Function HiByte(ByVal wParam As Long) As Integer
        HiByte = wParam \ &H100 And &HFF&
    End Function'  获得一个整数的低字节位
    Private Function LoByte(ByVal wParam As Long) As Integer
        LoByte = wParam And &HFF&
    End Function
      

  3.   

    '  Ping一个IP地址
    Private Function Ping(szAddress As String, ECHO As ICMP_ECHO_REPLY) As Long
        Dim hPort As Long
        Dim dwAddress As Long
        Dim sDataToSend As String
        Dim iOpt As Long
        sDataToSend = "Echo This"
        dwAddress = AddressStringToLong(szAddress)
        hPort = IcmpCreateFile()
        If IcmpSendEcho(hPort, dwAddress, sDataToSend, Len(sDataToSend), 0, ECHO, Len(ECHO), PING_TIMEOUT) Then
            '如果ping成功,状态返回0。
             Ping = ECHO.RoundTripTime
        Else
            Ping = ECHO.status * -1
        End If
        Call IcmpCloseHandle(hPort)
    End Function
     
    '  将文本框中的IP地址转换成系统识别的长整数形式
    Function AddressStringToLong(ByVal tmp As String) As Long
        Dim i As Integer
        Dim parts(1 To 4) As String
        i = 0
        '转换IP地址
        While InStr(tmp, ".") > 0
            i = i + 1
            parts(i) = Mid(tmp, 1, InStr(tmp, ".") - 1)
            tmp = Mid(tmp, InStr(tmp, ".") + 1)
        Wend
        i = i + 1
        parts(i) = tmp
        If i <> 4 Then
            AddressStringToLong = 0
            Exit Function
        End If
        AddressStringToLong = Val("&H" & Right("00" & Hex(parts(4)), 2) & Right("00" & Hex(parts(3)), 2) & Right("00" & Hex(parts(2)), 2) & Right("00" & Hex(parts(1)), 2))
    End Function'  初始化Socket
    Private Function SocketsInitialize() As Boolean
        Dim WSAD As WSADATA
        Dim X As Integer
        Dim szLoByte As String
        Dim szHiByte As String
        Dim szBuf As String
        
        '初始化Socket
        X = WSAStartup(WS_VERSION_REQD, WSAD)
        If X <> 0 Then
            MsgBox "Windows Sockets for 32 bit Windows " & "environments is not successfully responding."
            Exit Function
        End If
        
         '  判断是否有支持足够的Socket
        If LoByte(WSAD.wVersion) < WS_VERSION_MAJOR Or (LoByte(WSAD.wVersion) = WS_VERSION_MAJOR And HiByte(WSAD.wVersion) < WS_VERSION_MINOR) Then
            szHiByte = Trim$(Str$(HiByte(WSAD.wVersion)))
            szLoByte = Trim$(Str$(LoByte(WSAD.wVersion)))
            szBuf = "Windows Sockets Version " & szLoByte & "." & szHiByte
            szBuf = szBuf & " is not supported by Windows " & "Sockets for 32 bit Windows environments."
            MsgBox szBuf, vbExclamation
            Exit Function
        End If
        
        '  判断Winsock的版本是否被32为Winsock支持
        If WSAD.wMaxSockets < MIN_SOCKETS_REQD Then
            szBuf = "This application requires a minimum of " & Trim$(Str$(MIN_SOCKETS_REQD)) & " supported sockets."
            MsgBox szBuf, vbExclamation
            Exit Function
        End If
        SocketsInitialize = True
    End Function'  关闭Sockets
    Private Sub SocketsCleanup()
        Dim X As Long
        '关闭Sockets
        X = WSACleanup()
        If X <> 0 Then
            MsgBox "Windows Sockets error " & Trim$(Str$(X)) & " occurred in Cleanup.", vbExclamation
        End If
    End SubPrivate Sub Command1_Click()
        Dim ECHO As ICMP_ECHO_REPLY
        Dim pos As Integer
        If SocketsInitialize() Then
            'ping地址
            Call Ping(Text2.Text, ECHO)
            '显示ping结果
            Text1(0).Text = GetStatusCode(ECHO.status)
            Text1(1).Text = ECHO.RoundTripTime & " ms"
            Text1(2).Text = ECHO.DataSize & " bytes"
            If Left$(ECHO.Data, 1) <> Chr$(0) Then
                pos = InStr(ECHO.Data, Chr$(0))
                Text1(3).Text = Left$(ECHO.Data, pos - 1)
            End If
            Text1(4).Text = ECHO.DataPointer
            SocketsCleanup
        End If
    End Sub
      

  4.   

    不太明白你意思。如果是用户在线,你在用户登录时改变一个字段ture,注销时改成false。
      

  5.   

    winsock發消息過去,接受就是ok,所以用tcp處理就ok
      

  6.   

    Option ExplicitPublic Enum NetConnTypeConstants
       INTERNET_CONNECTION_MODEM = &H1&
       INTERNET_CONNECTION_LAN = &H2&
       INTERNET_CONNECTION_PROXY = &H4&
       INTERNET_RAS_INSTALLED = &H10&
       INTERNET_CONNECTION_OFFLINE = &H20&
       INTERNET_CONNECTION_CONFIGURED = &H40&
    End Enum
    Private Const RAS_MAXENTRYNAME As Integer = 256
    Private Const RAS_MAXDEVICETYPE As Integer = 16
    Private Const RAS_MAXDEVICENAME As Integer = 128
    Private Const RAS_RASCONNSIZE As Integer = 412Private Type RasEntryName
        dwSize As Long
        szEntryName(RAS_MAXENTRYNAME) As Byte
    End TypePrivate Type RasConn
        dwSize As Long
        hRasConn As Long
        szEntryName(RAS_MAXENTRYNAME) As Byte
        szDeviceType(RAS_MAXDEVICETYPE) As Byte
        szDeviceName(RAS_MAXDEVICENAME) As Byte
    End TypePrivate Declare Function RasEnumConnections Lib _
    "rasapi32.dll" Alias "RasEnumConnectionsA" (lpRasConn As _
    Any, lpcb As Long, lpcConnections As Long) As LongPrivate Declare Function RasHangUp Lib "rasapi32.dll" Alias _
    "RasHangUpA" (ByVal hRasConn As Long) As LongPrivate 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 Function InternetConnected( _
        Optional ByRef eConnectionInfo As NetConnTypeConstants, _
        Optional ByRef sConnectionName As String _
        ) As Boolean
       
        Dim dwFlags As Long
        Dim sNameBuf As String
        Dim lR As Long
        Dim iPos As Long
        
        sNameBuf = String$(513, 0)
        lR = InternetGetConnectedStateEx(dwFlags, sNameBuf, 512, 0&)
        eConnectionInfo = dwFlags
        iPos = InStr(sNameBuf, vbNullChar)
        
        If iPos > 0 Then
            sConnectionName = Left$(sNameBuf, iPos - 1)
        ElseIf Not sNameBuf = String$(513, 0) Then
            sConnectionName = sNameBuf
        End If
        
        InternetConnected = (lR = 1)
    End Function
    Public Property Get IsConnected() As Boolean
        IsConnected = InternetConnected()
    End PropertyPublic Property Get ConnType() As Long
        Dim connInfo As NetConnTypeConstants
        InternetConnected connInfo
        ConnType = connInfo
    End PropertyPublic Function ConnTypeDevice(nType As Long) As String
        Dim strReturn As String
        
        If nType And INTERNET_CONNECTION_LAN Then
            strReturn = "LAN"
        ElseIf nType And INTERNET_CONNECTION_MODEM Then
            strReturn = "Modem"
        ElseIf nType And INTERNET_CONNECTION_PROXY Then
            strReturn = "Proxy"
        ElseIf nType And INTERNET_CONNECTION_OFFLINE Then
            strReturn = "Offline"
        End If
        
        ConnTypeDevice = strReturn
    End FunctionPublic Property Get ConnName() As String
        Dim strName As String
        InternetConnected , strName
        ConnName = strName
    End PropertyPublic Sub HangUp()
        Dim i As Long
        Dim lpRasConn(255) As RasConn
        Dim lpcb As Long
        Dim lpcConnections As Long
        Dim hRasConn As Long
        Dim ReturnCode As Long
        Dim gstrISPName As String
        
        lpRasConn(0).dwSize = RAS_RASCONNSIZE
        lpcb = RAS_MAXENTRYNAME * lpRasConn(0).dwSize
        lpcConnections = 0
        ReturnCode = RasEnumConnections(lpRasConn(0), lpcb, _
        lpcConnections)    If ReturnCode = 0 Then
            For i = 0 To lpcConnections - 1
                If Trim(ByteToString(lpRasConn(i).szEntryName)) = Trim(gstrISPName) Then
                    hRasConn = lpRasConn(i).hRasConn
                    ReturnCode = RasHangUp(ByVal hRasConn)
                End If
            Next i
        End If
    End SubPrivate Function ByteToString(bytString() As Byte) As String
        Dim i As Integer
        
        i = 0
        While bytString(i) = 0&
            ByteToString = ByteToString & ChrB$(bytString(i))
            i = i + 1
        Wend
    End Function以上代码放入一个类模块里,调用。
      

  7.   

    要简单?这个,最简单'Example Name:IsConnected
    'Example by Vijay Phulwadhawa ([email protected])Private Declare Function InternetGetConnectedState Lib "wininet.dll" (ByRef lpdwFlags As Long, ByVal dwReserved As Long) As Long
    Private Sub Form_Load()
        MsgBox "Is connected to the internet: " + CStr(IsConnected)
    End Sub
    Public Function IsConnected() As Boolean
        If InternetGetConnectedState(0&, 0&) = 1 Then
            IsConnected = True
        Else
            IsConnected = False
        End If
    End Function