我在做个小东西,就是从远程服务器读出数据,存到另一个服务器上,在此期间,如果网络异常,断开,则自动重新连接服务器,请教大家,怎样解决? 谢谢啦!

解决方案 »

  1.   

    Option Explicit
    '/*有关的API声明和定义*/
    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 Long
      Private Declare Function InternetGetConnectedState Lib "wininet.dll" _
    (ByRef dwFlags As Long, ByVal dwReserved As Long) As Long   '/*常数和变量的设定*/
    Public Const RAS95_MaxEntryName = 256
    Public Const RAS95_MaxDeviceType = 16
    Public Const RAS95_MaxDeviceName = 32Private Enum ConnectionStates
        Modem = &H1
        LAN = &H2
        Proxy = &H4
        RasInstalled = &H10
        Offline = &H20
        Configured = &H40
    End EnumPublic Type RASCONN95
      dwSize As Long
      hRasCon As Long
      szEntryName(RAS95_MaxEntryName) As Byte
      szDeviceType(RAS95_MaxDeviceType) As Byte
      szDeviceName(RAS95_MaxDeviceName) As Byte
    End TypePublic Type RASCONNSTATUS95
      dwSize As Long
      RasConnState As Long
      dwError As Long
      szDeviceType(RAS95_MaxDeviceType) As Byte
      szDeviceName(RAS95_MaxDeviceName) As Byte
    End Type
        Dim eR As EIGCInternetConnectionState
        Dim sMsg As String
        Dim sName As String
        Dim bConnected As Boolean    Private Declare Function InternetSetDialState Lib "wininet.dll" _
    (ByVal lpszConnectoid As String, ByVal dwState As Long, _
         ByVal dwReserved As Long) As Long    Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" _
    (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, _
        ByVal sProxyBypass As String, ByVal lFlags As Long) 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 Enum EIGCInternetConnectionState
         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    'InternetConnected 函数判断是否连接到Internet的函数
        '获得是否以及通过何中方式连接到Internet上
        Private Function InternetConnected(Optional ByRef eConnectionInfo _
         As EIGCInternetConnectionState, 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'/*函数IsConnected返回连通的状态,如果为True则表示已连通*/Public Function IsConnected() As Boolean
      Dim TRasCon(255) As RASCONN95
      Dim lg As Long
      Dim lpcon As Long
      Dim RetVal As Long
      Dim Tstatus As RASCONNSTATUS95
      TRasCon(0).dwSize = 412
      lg = 256 * TRasCon(0).dwSize
      RetVal = RasEnumConnections(TRasCon(0), lg, lpcon)
      If RetVal <> 0 Then
        'MsgBox "错误"
        Exit Function
      End If
      Tstatus.dwSize = 160
      RetVal = RasGetConnectStatus(TRasCon(0).hRasCon, Tstatus)
      If Tstatus.RasConnState = &H2000 Then
        IsConnected = True
      Else
        IsConnected = False
        bConnected = InternetConnected(eR, sName)
        If (eR And INTERNET_CONNECTION_OFFLINE) = INTERNET_CONNECTION_OFFLINE Then
            IsConnected = False
        Else
            IsConnected = True
        End If
      End If
    End Function
      

  2.   

    如果你用的是TCP协议的Winsock,断开会触发Error事件
      

  3.   

    使用vb.net 做一个服务程序好了,这样出现错误windows自动会重启动改服务
    VB.NET Windows服务开发手册:http://www.image2003.com/book/open.asp?ID=836另外可以捕捉到网络异常,然后使用timer设置一定时间以后重新连接网络。
      

  4.   

    用 RAS方法 很干净。我有源码 需要发短信