要编写一个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到达的数据。请大家探讨。

解决方案 »

  1.   

    你的分析是对的。
    一旦winsock控件开始运行了,vb程序已经变成了2个且只有(注意!)2个线程了,可以用进程观看工具查看,而且winsock线程的优先级是above normal了。。 它只负责处理接受网络数据。所以不存在数据丢失的问题(并动态的增大缓冲区)并且当没有未处理事件的才触发事件(注意!)否则just增大缓冲区置入内容但vb主线程可能繁忙而未及时响应事件,不过这没关系,当主消息队列循环闲下来的时候还是会处理的,而winsock.getdata默认是取出缓冲区的数据。这样就造成了明明发送了2个包,但是只触发一次事件就接受完毕的原因,所以在应用层应该给予控制,当发送了多个包的时候应该给予报头,让另一端的winsock知道对方发送了几个包
      

  2.   

    就是说这些数据都不会丢,只是说是哪一个包里面发过来的数据并没有区分开,而且什么时候收到的这些数据、是host哪一次发过来的数据也不知道,是这么理解的吗?对了,你是自己发现这个问题的还是看了什么资料吗?本来我想到这个问题的时候还担心了好一阵呢。我当时考虑会不会由于网络速度变快从而引起host发来的数据丢失,看来这个担心是多余的。嘻嘻....
      

  3.   

    以前写过一个短信的程序,用winsock通信,不过老是不能解开包。找资料也找不到, 自己看了下,也不保证正确, 现在好多都忘了。欢迎指教