一.具体要实现下面的功能:
我有一台服务器在上海,安装了SQL Server2000数据库,我另一台机器在杭州,使用了vb的ado编写的程序,怎样能够访问和更新在上海的服务器上的数据。就象在一个局域网里一样。要求使用vb代码能够解决。(所有机器没有固定ip地址)
二.我已经具备的可用的资源:
   所有的机器都已经安装adsl或宽带,能够访问internet。
   我有一个.com.cn网站。虚拟主机在上海和广州各一个。
   我有已经写好的使用ado访问本地局域网SQL Server2000数据库的成型的程序。
三.一些已经探讨过的方案
   1.组建vpn
   2.使用vb编程实现将动态ip地址与机器名称动态捆绑。充分利用我的现有资源。保证通过访问服务器名称,即可由程序自动取得动态ip地址,实现访问上海服务器上SQL Server2000数据。
 
   本人偏向于第二种方案。因为第一种方法,好象要购买vpn的设备,很昂贵呀。
   请各位高手给出解决方法,提供成熟源代码者,将给予重金酬谢(请留下qq号或联系方式,解决后马上兑现。)。或者有什么更好的其它办法,也请各位发表一下高见。

解决方案 »

  1.   

    三.一些已经探讨过的方案
       1.组建vpn
       2.使用vb编程实现将动态ip地址与机器名称动态捆绑。充分利用我的现有资源。保证通过访问服务器名称,即可由程序自动取得动态ip地址,实现访问上海服务器上SQL Server2000数据。1.其实,直接用拨号拨如到服务器即可访问
    2.如果数据量不大的情况下,可以把本地的数据通过xml提交到远程的asp文件
    3.没有固定ip,winsock可能用不了了,否则,作的服务端程序来响应客户端的请求
      

  2.   

    使用asp也是比较好的方式
    如果你的程序以组件方式编写,可以比较容易的从c/s过渡到b/s怎样能够访问和更新在上海的服务器上的数据??
    有没有数据上传的可能,两边数据同步的可能?
      

  3.   

    我的设想:
        用vb写一个网络寻呼机的server和client端。上海和杭州各安装client。在上海主机端在每次开机上网后,使用winsock得到该机的ip地址。自动通过网络寻呼机client通知其它机器,其它机器开机后自动取得新的ip地址,使用上海方面的数据。server可以放在我的虚拟主机上,但现在我不知我的虚拟主机能否支持我的网络寻呼机的server功能?这种方案行吗?
      

  4.   

    解决办法是,用VB编写DCOM的应用程序。就是ActiveX EXE类型的,和ActiveX DLL基本一样。
    1.编写一个DCOM应用程序,在其中定义一些接口用于访问SQL Server。
    2.将该应用程序安装在你的上海主机上。
    3.编写客户应用程序,他调用你的DCOM应用程序。创建DCOM时,使用主机名而不是IP。
    4.客户程序可以是任何类型的。
    剩下的你视需要处理以上方案的缺点是,DCOM所在的主机和防火墙一起工作时,配置起来需要一番功夫。
    另外,如果该主机同时又是Web服务器,那么你可能必须放弃防火墙。
      

  5.   

    补充,DCOM访问SQL server你完全可以像在局域网里一样编写,不用任何特殊处理。当然用RDO的话就另说了。
      

  6.   


    我曾经用过活动IP,比如 a11s.softhome.cn
    服务端(安装活动IP客户端软件)
    安装客户端 ping 后发现他是自己的IP!!!!主要在客户端
    这就很简单了,直接进行域名解析(得到服务器的当前IP)(或者找一个ping的源代码看看)直接Winsock (搞定)
      

  7.   

    不大放心,补充两句(发现了局域网)对外的服务器一定要有外部公共IP,如果没有,那么还要进行以下步骤如果服务器在局域网内,那么去找你的网关或者代理服务器进行端口映射,这样才能保证你的
    端口能与外界联上(备注:我申请的动态IP是免费的)
      

  8.   

    刚好找到lihonggen0在CSDN上 曾经发表过的代码
    vb中从域名得到IP及从IP得到域名 
    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 WSADescription_Len = 256
    Private Const WSASYS_Status_Len = 128Private Type HOSTENT
       hname As Long
       hAliases As Long
       hAddrType As Integer
       hLength As Integer
       hAddrList As Long
    End TypePrivate Type WSADATA
       wversion As Integer
       wHighVersion As Integer
       szDescription(0 To WSADescription_Len) As Byte
       szSystemStatus(0 To WSASYS_Status_Len) As Byte
       iMaxSockets As Integer
       iMaxUdpDg As Integer
       lpszVendorInfo As Long
    End Type
    Private Declare Function gethostbyaddr Lib "WSOCK32.DLL" (addr As Any, ByVal _
    byteslen As Integer, addrtype As Integer) As Long
    Private Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As Long
    Private Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal _
            wVersionRequired&, lpWSAData As WSADATA) As Long
    Private Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long
    Private Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal _
            hostname$) As Long
    Private Declare Sub RtlMoveMemory Lib "KERNEL32" (hpvDest As Any, _
            ByVal hpvSource&, ByVal cbCopy&)Function hibyte(ByVal wParam As Integer)    '获得整数的高位
       hibyte = wParam \ &H100 And &HFF&
    End FunctionFunction lobyte(ByVal wParam As Integer)    '获得整数的低位
       lobyte = wParam And &HFF&
    End FunctionFunction SocketsInitialize()
       Dim WSAD As WSADATA
       Dim iReturn As Integer
       Dim sLowByte As String, sHighByte As String, sMsg As String
       
       iReturn = WSAStartup(WS_VERSION_REQD, WSAD)
       
       If iReturn <> 0 Then
          MsgBox "Winsock.dll 没有反应."
          End
       End If
       
       If lobyte(WSAD.wversion) < WS_VERSION_MAJOR Or (lobyte(WSAD.wversion) = WS_VERSION_MAJOR And hibyte(WSAD.wversion) < WS_VERSION_MINOR) Then
          sHighByte = Trim$(str$(hibyte(WSAD.wversion)))
          sLowByte = Trim$(str$(lobyte(WSAD.wversion)))
          sMsg = "Windows Sockets版本 " & sLowByte & "." & sHighByte
          sMsg = sMsg & " 不被winsock.dll支持 "
          MsgBox sMsg
          End
       End If
       
       If WSAD.iMaxSockets < MIN_SOCKETS_REQD Then
          sMsg = "这个系统需要的最少Sockets数为 "
          sMsg = sMsg & Trim$(str$(MIN_SOCKETS_REQD))
          MsgBox sMsg
          End
       End If
       
    End FunctionSub SocketsCleanup()
       Dim lReturn As Long
       
       lReturn = WSACleanup()
       
       If lReturn <> 0 Then
          MsgBox "Socket错误 " & Trim$(str$(lReturn)) & " occurred in Cleanup "
          End
       End If
    End Sub
    Sub Form_Load()
        '初始化Socket
        Text1.Text = "www.csdn.net"
        SocketsInitialize
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        '清除Socket
        SocketsCleanup
    End Sub
    Private Function getip(name As String) As String
       Dim hostent_addr As Long
       Dim host As HOSTENT
       Dim hostip_addr As Long
       Dim temp_ip_address() As Byte
       Dim i As Integer
       Dim ip_address As String
       
       hostent_addr = gethostbyname(name)
       
       If hostent_addr = 0 Then
          getip = ""                     '主机名不能被解释
          Exit Function
       End If
       
       RtlMoveMemory host, hostent_addr, LenB(host)
       RtlMoveMemory hostip_addr, host.hAddrList, 4
       
       ReDim temp_ip_address(1 To host.hLength)
       RtlMoveMemory temp_ip_address(1), hostip_addr, host.hLength
       
       For i = 1 To host.hLength
          ip_address = ip_address & temp_ip_address(i) & "."
       Next
       ip_address = Mid$(ip_address, 1, Len(ip_address) - 1)
       
       getip = ip_addressEnd FunctionPrivate Sub Command1_click()
        Dim str As String
        str = getip(Text1.Text)
        If str = "" Then
            Text2.Text = "主机名不能被解释"
        Else
            Text2.Text = str
        End If
    End Sub
    Private Function getname(addrstr As String) As String
        Dim hostent_addr As Long
        Dim host As HOSTENT
        Dim addr(0 To 50) As Byte
        Dim addrs As String
        Dim hname(1 To 50) As Byte
        Dim str As String
        Dim i As Integer, j As Integer
        Dim temp_int As Integer
        Dim byt As Byte
        str = Trim$(addrstr)
        i = 0
        j = 0
        Do
            temp_int = 0
            i = i + 1
            Do While Mid$(str, i, 1) >= "0" And Mid$(str, i, 1) <= "9" And i <= Len(str)
                temp_int = temp_int * 10 + Mid$(str, i, 1)
                i = i + 1
            Loop
            If temp_int <= 255 Then
                addr(j) = temp_int
                j = j + 1
            End If
        
        Loop Until Mid$(str, i, 1) <> "." Or i > Len(str) Or temp_int > 255
        If temp_int > 255 Then
            getname = "地址非法"
            Exit Function
        End If
        hostent_addr = gethostbyaddr(addr(0), j, 2)
        If hostent_addr = 0 Then
            getname = "此地址无法解析"
            Exit Function
        End If
        RtlMoveMemory host, hostent_addr, LenB(host)
        RtlMoveMemory hname(1), host.hname, 50
        j = 51
        For i = 1 To 50
            If hname(i) = 0 Then
                j = i
            End If
            If i >= j Then
                hname(i) = 32
            End If
        Next i
        getname = Trim$(StrConv(hname, vbUnicode))
    End Function
    Private Sub Command2_Click()
        Dim name As String
        name = getname(Text2.Text)
        If name = "" Then
            name = "此地址没有域名"
        End If
        Text1.Text = name
    End Sub 
    占击"command1"试试,就知道了!
      

  9.   

    没看明白你写的服务器有 固定 ip 吗?
    有 动态 公网 ip 吗?只要有 公网 ip 都可以实现在你用 ADO 连远程服务器的时候, 用域名连接,这个域名解析动态ip 就行了