什么是VB6、CGI、API?
VB 全称Visual Basic,是当今世界上应用最广泛的编程语言之一,它也被公认为是编程效率最高的一种编程方法。无论是开发功能强大、性能可靠的商务软件,还是编写能处理实际问题的实用小程序,VB都是最快速、最简便的方法。VB6 即Visual Basic的60版本。
CGI 即Common Gateway Interface(公共网关接口)。它是运行于网络服务器上的一类程序,用于一个可以产生相同结果或随用户输入而变化结果的程序。CGI 程序通常用于完成 Web 网页中表单数据的处理、数据库查询和实现与传统应用系统的集成等工作。
API 全称Application Programming Interface(应用编程接口),是Windows平台的应用程序编程接口。它是能用来操作组件、应用程序或者操作系统的一组函数。典型的情况下,API 由一个或多个提供某种特殊功能的 DLL 组成。
在 VB 中 程序中引用 Internet Explorer 对象 :在"工程"菜单中单击"引用",在弹出对话框中选择"Microsoft Internet Controls"(SHDOCVWDLL),就把对 Internet Explorer对象库的引用添加到了我们自己的工程文件中。
'使用IE对象打开一个网页 :
Dim Browser As Object
Set Browser = CreateObject("InternetExplorerApplication")
BrowserVisible = True
BrowserNavigate ("http://wwwbaiducom")
'得到当前browser的页面字体内容
Public Function getWebContent()Function getWebContent(browser As WebBrowser) As String
Dim doc As Object
Dim i As Object
Dim strHtml As String
Set doc = browserDocument
For Each i In docAll
strHtml = strHtml & Chr(13) & iinnerText
Next
getWebContent = strHtml
End Function
'得到当前browser的页面Html内容
Public Function getWebHtml()Function getWebHtml(browser As WebBrowser) As String
Dim doc As Object
Dim i As Object
Dim strHtml As String
Set doc = browserDocument
For Each i In docAll
strHtml = strHtml & Chr(13) & iinnerHtml
Next
getWebHtml = strHtml
End Function
分析了一下你的问题,有几点问题你需要排查:
1、既然是动态域名,那么你的数据库服务器应该面对的是公网。如果是公网,局域网IP连接是否成功就毫无意义。
2、你有否尝试过使用公网IP连接,如果使用公网IP连接成功,那就有可能是域名解析的问题。
3、你是否设置好了路由器的端口映射,分析你的题目,我估计你网络状态可能是多层路由,那么多层路由的端口映射是否都设置好了?还是只设置了一层?
4、如果设置好了端口映射,是不是还有端口号的问题,虽然我没有尝试过,但是由于你的两台电脑可以通过局域网IP连接,可以看出两台电脑虽处于不同网段,但共同使用一个路由接入公网,这样会不会产生端口号冲突?可以尝试修改数据库服务器的SQL SERVER的端口号,并进行映射。
5、服务器上的数据库是使用默认实例名还是指定实例名,如果是指定实例名要在服务器名后加上实例名。
6、建议,局域网内使用局域网IP连接,局域网外使用域名连接。测试也要放在局域网外测试才有意义。
自己定义一个结构体发字节流过去不就可以了。建议把字节流封包传输
如:
第1个字节 &HB1 表示包头开始标志
第2个字节 &H01 表示发送数据命令
第3-4个字节 &H0005 表示数据长度为5个字节
第5个字节 &H00 具体的数据第1个字节内容
第6个字节 &H00 具体的数据第2个字节内容
第7个字节 &H00 具体的数据第3个字节内容
第8个字节 &H00 具体的数据第4个字节内容
第9个字节 &H00 具体的数据第5个字节内容
第10个字节 &HB5 从包头开始逐个进行异或运算的“异或校检码”,校检数据的完整性用
第11个字节 &HB2 表示包尾
上面这个包主要由6个部分组成
1、包头 用来进行包的初始化识别
2、命令 扩展包协议用,如传输语句、传输控制指令、移动记录等
3、数据长度 我这里的例子是用两个字节表示长度,即最多一个包传输65536个字节的数据
4、数据区域 具体要传输的数据段落
5、异或校检码 为了检测数据的完整性,也可以用CRC16或CRC32等算法进行数据校检
6、包尾 用来完整识别一个包内容的结束标志
通过上面这个包结构,可以在数据包里放置小于65536个字节的内容进行传输
在处理传输数据时可以这么做:
Type SendReport
sr_head As Byte ' 固定为 &HB1
sr_cmd As Byte ' 命令
sr_size As Integer ' 数据大小
sr_data() As Byte ' 数据内容
sr_xor As Byte ' 异或校检码
sr_end As Byte ' 固定为 &HB2
End Type
Type SendRF
rs_type As Integer ' 字段类型
rs_NameSize As Integer ' 字段名称字节数
rs_name() As Byte ' 字段名称内容
rs_size As Integer ' 字段数据大小
rs_data() As Byte ' 字段数据内容
End Type
Type SendRS
rs_fcount As Integer ' 字段数量
rs_data() As SendRF ' 字段数据
End Type
然后把数据集的数据赋值到上面的机构体里,再把结构体的数据格式化到一个字节数组中,便可把这个字节数组发送出去,接收端只要根据格式提取出相关数据到结构体,就可以实现数据的还原过程。在过程里只要善用 CopyMemory API 就可以很容易实现这种过程的处理,如
Dim SR As SendReport
Dim SentBytes() as Byte
Dim i As Long
SRsr_head = &HB1:SRsr_xor = SRsr_head
SRsr_cmd = &H01:SRsr_xor = SRsr_xor xor SRsr_cmd
SRsr_size = &H05:SRsr_xor = SRsr_xor xor SRsr_size
Redim SRsr_data(4)
for i=0 to ubound(SRsr_data)
SRsr_xor = SRsr_xor xor SRsr_data(i)
next i
SRsr_end = &HB2
Redim SentBytes(10)
CopyMemory SentBytes(0),SRsr_head,1
CopyMemory SentBytes(1),SRsr_cmd,1
CopyMemory SentBytes(2),SRsr_size,2
CopyMemory SentBytes(4),SRsr_data(0),5
SentBytes(Ubound(SentBytes)-1) = SRsr_xor
SentBytes(Ubound(SentBytes)) = SRsr_end
Winsock1SendData SentBytes
当然上面只是封包的过程,没有设置具体的数据集数据,不过原理也差不多,也就是读写SendRF和SendRS结构的问题。具体的自己做做看吧。
用ADO远程连接SQL的编写方式和局域网内部的是一样的,如果你在内网能够访问SQL的话,那么在公网上你需要在远端路由器上开启IP地址及端口映射,比如,SQL服务器的内网IP 是192168225 而外网地址是125505861 的话,你就必须在路由器上 添加125505861:443 到 192168225:443的映射记录。最好在SQL服务器上的防火墙里也添加上443端口例外。然后在程序里指定ADO的连接地址为125505861(SQL服务器的外网地址) 最后补充一下,通过公网直接访问SQL是不推荐的做法,主要是因为安全问题以及效率问题。一般的做法是在服务器端开发相应的数据服务程序,用于和客户端通信。建议你看看B/S和C/S两种架构。
0条评论