55 55 55 55 55 55 83 83 00 07 00 00 02 05 22 3B 00 64 00 01 02 05 23 02 00 2D 00 02 02 05 23 17 00 43 00 03 02 05 23 19 00 46 00 04 01 05 23 21 00 4E 00 05 01 05 23 31 00 5F 00 06 01 05 24 24 00 54 ff ff ff ff 
以上是一个完整的数据包的数据,但是通过响应了N次 DataArrival事件才接受完以上的数据
每次触发DataArrival事件就从缓存中接受一次数据getdata byte1()
第1次 byte1: 55 55 55 55
第2次 byte1: 55 55 83 83 00 07 00 00
第3次 byte1: 02 02 22 3B 00 64 
...
第N次 byte1:00 54 ff ff ff ff 
遇到这次情况如何处理数据,处理的过程放在DataArrival事件中明显不错,那应该怎么才能处理才能成功?
关联:http://topic.csdn.net/u/20090317/22/0d4170a7-394f-4357-8423-b9ada47fa161.html

解决方案 »

  1.   

    总有个报文尾吧,不然你怎么知道完成了呢?你手动debug的时候怎么知道的报文结束了?你就
    do until StreamEnd(strTemp)=truestrtemp=byt1
    str=str & strtemp
    loop
      

  2.   

    只有报头,没有包尾,数据处理的函数Mdeal()应该如何触发
      

  3.   

    DataArrival接收的数据被触发的次数和你发送数据调用SendData的次数没有必然关联
    试想,你用SendData发个1G的数据包,不可能要求对方把那1G东西先帮你缓存了然后最后再一并触发一次DataArrival事件吧?因为对方机器受很多情况限制(例如内存不够大),不可能有一个通用的解决方案来进行数据缓冲所以vb的Winsock实现是一旦有数据到达,就直接触发DataArrival事件
    至于你该如何组合数据成一个完整的包,那就是看你的设计了
    你可以在每个包的头几个字节说明包的长度,然后先把这几个字节读出来,计算出后来要读的长度,再继续等待这样