| 发表于:2007-06-18 11:53:57 楼主 |
public packagelen as long '数据包的长度 '服务器收到的消息队列 public userrecievemsgseq as string private sub smsserver_connectionrequest(index as integer, byval requestid as long) if index = 0 then num = num + 1 load smsserver(num) smsserver(num).localport = 0 smsserver(num).accept requestid end if end sub private sub smsserver_dataarrival(index as integer, byval bytestotal as long) '数据到达时作相应的处理 if bytestotal > 0 then call putmessagetoseqstr(index, bytestotal) end if end sub public function putmessagetoseqstr(byval index as long, byval aa as long) dim asmsmessagebyte() as byte dim templastbyteseq as string dim smslenbyte() as byte '从服务器接收消息时,把字节数组放到队列中 dim sdatebyte() as byte '全部读取缓冲区中的数据 smsserver(index).getdata sdatebyte, vbarray + vbbyte '把缓冲区的数据放到缓冲变量中 for i = lbound(sdatebyte) to ubound(sdatebyte) if userrecievemsgseq = " " then userrecievemsgseq = sdatebyte(i) else userrecievemsgseq = userrecievemsgseq & ", " & sdatebyte(i) end if next dim temparray() as string temparray = split(userrecievemsgseq, ", ") dim temparraylen as long temparraylen = ubound(temparray) + 1 if packagelen = 0 then if temparraylen > = 4 then '计算长度 redim smslenbyte(3) smslenbyte(0) = temparray(0) smslenbyte(1) = temparray(1) smslenbyte(2) = temparray(2) smslenbyte(3) = temparray(3) 'dim smslen as integer '包的十进制长度 packagelen = bytearraytoint(smslenbyte) '说明致少有一个完整的数据包,开始循环取包 while (packagelen > 0 and temparraylen > = packagelen) doevents '数据包 redim asmsmessagebyte(packagelen - 1) '调试时发现packagelen=0,不明白,为什么=0? for i = 0 to packagelen - 1 asmsmessagebyte(i) = temparray(i) next '把队列中的此消息去掉 'dim templastbyteseq as string '先清空,否则字串会越来越长 templastbyteseq = " " for i = packagelen to ubound(temparray) if templastbyteseq = " " then templastbyteseq = temparray(i) else templastbyteseq = templastbyteseq & ", " & temparray(i) end if next userrecievemsgseq = templastbyteseq doevents '对消息进行分类处理分析 call dataanalytic(asmsmessagebyte, index, aa) doevents temparray = split(userrecievemsgseq, ", ") temparraylen = ubound(temparray) + 1 if temparraylen > = 4 then '算出下一个包的长度 redim smslenbyte(3) smslenbyte(0) = temparray(0) smslenbyte(1) = temparray(1) smslenbyte(2) = temparray(2) smslenbyte(3) = temparray(3) packagelen = bytearraytoint(smslenbyte) else packagelen = 0 end if wend end if else '有长度 '说明致少有一个完整的数据包,开始循环取包 while (packagelen > 0 and temparraylen > = packagelen) doevents 'if packagelen = 0 then exit do '数据包 'dim asmsmessagebyte() as byte redim asmsmessagebyte(packagelen - 1) for i = 0 to packagelen - 1 asmsmessagebyte(i) = temparray(i) next '把队列中的此消息去掉 'dim templastbyteseq as string '先清空,否则字串会越来越长 templastbyteseq = " " for i = packagelen to ubound(temparray) if templastbyteseq = " " then templastbyteseq = temparray(i) else templastbyteseq = templastbyteseq & ", " & temparray(i) end if next userrecievemsgseq = templastbyteseq doevents '对消息进行分类处理分析 call dataanalytic(asmsmessagebyte, index, aa) doevents temparray = split(userrecievemsgseq, ", ") temparraylen = ubound(temparray) + 1 if temparraylen > = 4 then '算出下一个包的长度 redim smslenbyte(3) smslenbyte(0) = temparray(0) smslenbyte(1) = temparray(1) smslenbyte(2) = temparray(2) smslenbyte(3) = temparray(3) packagelen = bytearraytoint(smslenbyte) else packagelen = 0 end if wend end if end function --------------------------------- 以上是接收数据部分,数据包的长度是前四个字节定义的 cmdlen long(4字节),测试时发现,连续接收包时,特别地传文件时 redim asmsmessagebyte(packagelen - 1),packagelen会出现=0的情况, 怎么会有这现象呢????!!!!不明白=0了还能进入while循环? 循环条件明明是while (packagelen > 0 and temparraylen > = packagelen)怎么还能进入循环呢??? |
|
|
|
|