您的位置:程序门 -> vb -> 网络编程



winsock莫名其妙的问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


winsock莫名其妙的问题
发表于: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)怎么还能进入循环呢???
 
发表于:2007-06-18 14:00:341楼 得分:0
好烂的程序啊,大量代码重复,而且设计上就有毛病,在event里调用doevents,全局变量到处该,不错才怪


while   packagelen   >   0
          doevents
          ...
wend
packagelen本来就是全局变量,你加doevents,如果有dataarrival事件,就会被改写


全部推翻了重做把。

发表于:2007-06-18 15:35:462楼 得分:0
lz:你的‘在测试时,发现bytearraytoint函数有时会溢出,有时不会,为什么呢,救救我吧,多谢了'还没结帖呢。
网上有很多此类的code,为什么不用,而用错误百出的东西?
发表于:2007-06-18 15:35:593楼 得分:0
http://community.csdn.net/expert/topicview3.asp?id=5600973
发表于:2007-06-18 15:44:544楼 得分:0
俺们刚学会vb,惭愧,各位老大,帮我改改吧,多谢了
发表于:2007-06-18 15:46:325楼 得分:0
http://community.csdn.net/expert/topicview3.asp?id=5600973
这个贴,没有解决问题啊,再等等,不是函数的问题
发现并发时才有这问题,如果不是并发,就没有错,不是函数bytearraytoint的问题
发表于:2007-06-18 15:47:416楼 得分:0
smartcatiboy()   大哥,象这样接收到数据,把数据包解析出来,怎么做好呢,帮帮我吧,多谢了
发表于:2007-06-19 16:14:437楼 得分:0
shu说下数据报格式   晚上看看
发表于:2007-08-16 22:54:118楼 得分:0
使用doevents是很危险的,一定保证doevents后,其他地方不会改这个值,否则容易死循环.


快速检索

最新资讯
热门点击