如下问题是在c++编的服务器端,vb编的客户端交互时发生,不知都用vb编是否有这种问题,请赐教
1.在DataArrival方法中超过4000的字节会发生丢包
  解决方法:每次收4000个字节,最后如小于4000字节说明收完,把所有收到的字节和起来。2.在DataArrival方法中如下代码
Private Sub wck_DataArrival(ByVal bytesTotal As Long)
  Call wck.GetData(arrData, vbArray + vbByte, bytesTotal)
    
  If bytesTotal - 1 <> UBound(arrData) Then
      Exit Sub
  End If
...
bytesTotal - 1 和 UBound(arrData)会不相等(UBound(arrData)=-1),这时要跳出此方法3.在DataArrival方法中在调用winsocket之前如Call wck.GetData(arrData, vbArray + vbByte, bytesTotal),必须先做几个DoEvents,否则报连接状态不可用。4.调用了
If wck.State = sckClosed Then
    wck.close
End If
后仍会有DataArrival事件触发,
解决方法:在该事件中加入(之前仍要doevents几次)
If wck.State = sckClosed Then
        Exit Sub
    End If虽然都找到了解决办法,但是对其中的问题还是不甚了解,希望大家能分析一下,特别是DataArrival之前的DoEvents方法,总决不大稳妥。

解决方案 »

  1.   

    4000字的和sock的缓存有关,和语言无关
    其实你直接Winsock.GetData(Data)即可如果发送包过大
    会有连续几次DataArrival事件连续触发
    建议你在发送时给数据加结尾标记
    接收时再判断是否完整,不完整,继续接收,直到接到结尾标记
      

  2.   

    除了以上问题外,还是会碰到得不到数据的情况,但用截包工具看,机器是得到了但是vb没得到,发现是还要给包加个结束标志,收到了才算结束。这个控件怎么问题那么多,不知道直接用api编有没有这些问题。
      

  3.   

    着不关vb的事情
    你用api问题更多
      

  4.   

    可是我同事用c++和api做的服务器端,不会发生这种情况,当然开始和结束标志是要的。
      

  5.   

    vb的socket收不到数据?
    你确定吗?
    这个问题我还没遇到过
    你vb6打了sp6补丁没有?
      

  6.   

    收的到但是有上述问题,其他问题都解决了,就一个太奇怪了
    就是在Private Sub wck_DataArrival(ByVal bytesTotal As Long)
    这个事件中必须doevents几次,否则会报连接不可用.其他的就是丢包问题,如getdata收到的字符串长度和bytesTotal 不相同,遇到的情况是等于-1.但在后几次还是能收到完整的包,所以加个结束字符串就行了.
    还有虽然服务器端一次发给客户端4000字节但是客户端收的时候在dataarrival事件中不一定每次收到4000,但总的是对的.这些可能是我没经验,网络本来就有这些问题,但是第一个问题实在是搞不定,虽然设了5次doevents后还没遇到过错误,但是不设doevents错误几率颇高.
      

  7.   

    这里有问题:
    Call wck.GetData(arrData, vbArray + vbByte, bytesTotal)改成
    Call wck.GetData(arrData, vbArray + vbByte, 4000)

    Call wck.GetData(arrData, vbArray + vbByte)还有,你的主要问题是接收同步问题。刚刚接收到一个新字节,DataArrival 就会触发。
    比较好的方法是,数据打包,在包头中说明长度。
    数据到达后,用 BytesReceived 循环检查是否有足够的字节包含包头。然后接收包头,再根据数据长度接收数据等。
      

  8.   

    比如我发了5000字节,但是可能会触发3次dataarrival事件,分别是1500,1000,2500,最后加起来才是正确的.加个长度和最后加个结束符号都能达到此功能,但是现在问题是在dataarrival事件最前面要加几个doevents否则可能会报连接不可用,不是每次都报.