要编写一个telnet协议的程序,winsock控件的接收数据一般是采用下面的代码Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim ch() As Byte
If Not receiving Then
receiving = True
Else
Print "busy"
receiving = False
Exit Sub
End If
If (bytesTotal > 0) Then ' If there is any data...
Winsock1.GetData ch, vbByte + vbArray, bytesTotal
Else
receiving = False
Exit Sub
End If
'....然后编写代码把 ch 数组里面的asc码变成字符并显示出来
'....(我暂时称为代码 A) !!!注意
receiving = False
End Sub 这个代码我一直在用,没有出现过问题。但是我发现一点奇怪的事,
比如说,我的一段字符串从host端来了,我用getdata获取它,接下来
用前面代码里面提到的代码 A来把数据显示出来,事实证明A运行是要一段
时间的,那么这时候服务器端如果在这个显示过程中又来一段数据的话,
这个数据就
会不被接收并显示出来。不过这种我想应该要发生的现象却从来没有发生。下面的时钟计数说明,要代码A和不要代码A
之间所用时间的区别,单位是毫秒。
=>代表开始接收数据的时间
#>代表结束接受数据的时间
我使用gettickcount系统函数来获得时间。2167286=> 。。如果显示数据要用的时间
2168157#>
<!!!-----------------871!!!> 871代表接收和显示数据用了871毫秒
2168157=> 第一次接收完成与第二次开始没有间隔
2169048#>
<!!!-----------------891!!!>
2169048=>
2169739#>
<!!!-----------------691!!!>
2169749=>
2170430#>
<!!!-----------------681!!!>2186193=> 。。如果不显示数据要用的时间
2186193#>
<!!!-----------------0!!!>
2186283=>
2186283#>
<!!!-----------------0!!!>
2186283=>
2186283#>
<!!!-----------------0!!!>
2186293=>
2186293#>
<!!!-----------------0!!!>事实证明并不会出现客户端正忙而丢弃host送来数据的事。我认为是因为以下原因产生的:
因为当一个 dataArrival 事件触发并且在运行这个事件的代码的时候,如果从host端有
新的数据到达,并不会触发dataArrival事件,这个事件会一直延迟到上一个dataArrival
事件结束才被触发。这可能是因为vb的代码不是多进程的运行的,而是一个语句接着一个
语句执行的,这样可以解释为什么不会发生丢失dataArrival到达的数据。请大家探讨。
Dim ch() As Byte
If Not receiving Then
receiving = True
Else
Print "busy"
receiving = False
Exit Sub
End If
If (bytesTotal > 0) Then ' If there is any data...
Winsock1.GetData ch, vbByte + vbArray, bytesTotal
Else
receiving = False
Exit Sub
End If
'....然后编写代码把 ch 数组里面的asc码变成字符并显示出来
'....(我暂时称为代码 A) !!!注意
receiving = False
End Sub 这个代码我一直在用,没有出现过问题。但是我发现一点奇怪的事,
比如说,我的一段字符串从host端来了,我用getdata获取它,接下来
用前面代码里面提到的代码 A来把数据显示出来,事实证明A运行是要一段
时间的,那么这时候服务器端如果在这个显示过程中又来一段数据的话,
这个数据就
会不被接收并显示出来。不过这种我想应该要发生的现象却从来没有发生。下面的时钟计数说明,要代码A和不要代码A
之间所用时间的区别,单位是毫秒。
=>代表开始接收数据的时间
#>代表结束接受数据的时间
我使用gettickcount系统函数来获得时间。2167286=> 。。如果显示数据要用的时间
2168157#>
<!!!-----------------871!!!> 871代表接收和显示数据用了871毫秒
2168157=> 第一次接收完成与第二次开始没有间隔
2169048#>
<!!!-----------------891!!!>
2169048=>
2169739#>
<!!!-----------------691!!!>
2169749=>
2170430#>
<!!!-----------------681!!!>2186193=> 。。如果不显示数据要用的时间
2186193#>
<!!!-----------------0!!!>
2186283=>
2186283#>
<!!!-----------------0!!!>
2186283=>
2186283#>
<!!!-----------------0!!!>
2186293=>
2186293#>
<!!!-----------------0!!!>事实证明并不会出现客户端正忙而丢弃host送来数据的事。我认为是因为以下原因产生的:
因为当一个 dataArrival 事件触发并且在运行这个事件的代码的时候,如果从host端有
新的数据到达,并不会触发dataArrival事件,这个事件会一直延迟到上一个dataArrival
事件结束才被触发。这可能是因为vb的代码不是多进程的运行的,而是一个语句接着一个
语句执行的,这样可以解释为什么不会发生丢失dataArrival到达的数据。请大家探讨。
一旦winsock控件开始运行了,vb程序已经变成了2个且只有(注意!)2个线程了,可以用进程观看工具查看,而且winsock线程的优先级是above normal了。。 它只负责处理接受网络数据。所以不存在数据丢失的问题(并动态的增大缓冲区)并且当没有未处理事件的才触发事件(注意!)否则just增大缓冲区置入内容但vb主线程可能繁忙而未及时响应事件,不过这没关系,当主消息队列循环闲下来的时候还是会处理的,而winsock.getdata默认是取出缓冲区的数据。这样就造成了明明发送了2个包,但是只触发一次事件就接受完毕的原因,所以在应用层应该给予控制,当发送了多个包的时候应该给予报头,让另一端的winsock知道对方发送了几个包