一.具体要实现下面的功能:
我有一台服务器在上海,安装了SQL Server2000数据库,我另一台机器在杭州,使用了vb的ado编写的程序,怎样能够访问和更新在上海的服务器上的数据。就象在一个局域网里一样。要求使用vb代码能够解决。(所有机器没有固定ip地址)
二.我已经具备的可用的资源:
所有的机器都已经安装adsl或宽带,能够访问internet。
我有一个.com.cn网站。虚拟主机在上海和广州各一个。
我有已经写好的使用ado访问本地局域网SQL Server2000数据库的成型的程序。
三.一些已经探讨过的方案
1.组建vpn
2.使用vb编程实现将动态ip地址与机器名称动态捆绑。充分利用我的现有资源。保证通过访问服务器名称,即可由程序自动取得动态ip地址,实现访问上海服务器上SQL Server2000数据。
本人偏向于第二种方案。因为第一种方法,好象要购买vpn的设备,很昂贵呀。
请各位高手给出解决方法,提供成熟源代码者,将给予重金酬谢(请留下qq号或联系方式,解决后马上兑现。)。或者有什么更好的其它办法,也请各位发表一下高见。
我有一台服务器在上海,安装了SQL Server2000数据库,我另一台机器在杭州,使用了vb的ado编写的程序,怎样能够访问和更新在上海的服务器上的数据。就象在一个局域网里一样。要求使用vb代码能够解决。(所有机器没有固定ip地址)
二.我已经具备的可用的资源:
所有的机器都已经安装adsl或宽带,能够访问internet。
我有一个.com.cn网站。虚拟主机在上海和广州各一个。
我有已经写好的使用ado访问本地局域网SQL Server2000数据库的成型的程序。
三.一些已经探讨过的方案
1.组建vpn
2.使用vb编程实现将动态ip地址与机器名称动态捆绑。充分利用我的现有资源。保证通过访问服务器名称,即可由程序自动取得动态ip地址,实现访问上海服务器上SQL Server2000数据。
本人偏向于第二种方案。因为第一种方法,好象要购买vpn的设备,很昂贵呀。
请各位高手给出解决方法,提供成熟源代码者,将给予重金酬谢(请留下qq号或联系方式,解决后马上兑现。)。或者有什么更好的其它办法,也请各位发表一下高见。
1.组建vpn
2.使用vb编程实现将动态ip地址与机器名称动态捆绑。充分利用我的现有资源。保证通过访问服务器名称,即可由程序自动取得动态ip地址,实现访问上海服务器上SQL Server2000数据。1.其实,直接用拨号拨如到服务器即可访问
2.如果数据量不大的情况下,可以把本地的数据通过xml提交到远程的asp文件
3.没有固定ip,winsock可能用不了了,否则,作的服务端程序来响应客户端的请求
如果你的程序以组件方式编写,可以比较容易的从c/s过渡到b/s怎样能够访问和更新在上海的服务器上的数据??
有没有数据上传的可能,两边数据同步的可能?
用vb写一个网络寻呼机的server和client端。上海和杭州各安装client。在上海主机端在每次开机上网后,使用winsock得到该机的ip地址。自动通过网络寻呼机client通知其它机器,其它机器开机后自动取得新的ip地址,使用上海方面的数据。server可以放在我的虚拟主机上,但现在我不知我的虚拟主机能否支持我的网络寻呼机的server功能?这种方案行吗?
1.编写一个DCOM应用程序,在其中定义一些接口用于访问SQL Server。
2.将该应用程序安装在你的上海主机上。
3.编写客户应用程序,他调用你的DCOM应用程序。创建DCOM时,使用主机名而不是IP。
4.客户程序可以是任何类型的。
剩下的你视需要处理以上方案的缺点是,DCOM所在的主机和防火墙一起工作时,配置起来需要一番功夫。
另外,如果该主机同时又是Web服务器,那么你可能必须放弃防火墙。
我曾经用过活动IP,比如 a11s.softhome.cn
服务端(安装活动IP客户端软件)
安装客户端 ping 后发现他是自己的IP!!!!主要在客户端
这就很简单了,直接进行域名解析(得到服务器的当前IP)(或者找一个ping的源代码看看)直接Winsock (搞定)
端口能与外界联上(备注:我申请的动态IP是免费的)
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"试试,就知道了!
有 动态 公网 ip 吗?只要有 公网 ip 都可以实现在你用 ADO 连远程服务器的时候, 用域名连接,这个域名解析动态ip 就行了