附代码请教:Winsock接收数据提示:“下标越界。”的问题,解决不了。
小弟搞了2天还是不行。请各为大虾指教。感激!PS:WSHQWD 为winsock1 的名称Private Sub WSHQWD_DataArrival(ByVal bytesTotal As Long)    Dim ConnetFlag As Byte
    Dim ConnetByteWSHQWD() As Byte
    
    Dim WSHQWDNum As Long
    Dim WDStrArr() As String * 2
    Dim WDDir As String
                                    
    ReDim WDStrArr(0 To 4679) As String * 2
    ReDim ConnetByteWSHQWD(0 To 4679) As ByteWDDir =App.Path & "\Data\123.txt"
        
                   If FlagSD = 0 Then
                           WSHQWD.GetData ConnetFlag
                             
                           ComboCSSZ_Kh.ListIndex = CInt(ConnetFlag) - 1                             
                            Call ChangeNSPBS '改变效验位
                            WSHQWD.SendData CByte(52)
                            
                            FlagSD = 1
                     
                     ElseIf FlagSD = 1 Then
                     
                            WSHQWD.GetData ConnetFlag
                            
                            If ConnetFlag = CByte(52) Then
                            
                                    WSHQWD.SendData CByte(255)
                                    
                                    FlagSD = 2
                            
                            End If
                            
                            
                    ElseIf FlagSD = 2 Then 
                                              
                                    WSHQWD.GetData ConnetByteWSHQWD()
                                     For WSHQWDNum = 0 To 4679                                    WDStrArr(WSHQWDNum) = ConnetByteWSHQWD(WSHQWDNum)在这里出现下标越界的提示!
                                    Open WDDir For Random As #1 Len = Len(WDStrArr(WSHQWDNum))
                                    Put #1, WSHQWDNum + 1, WDStrArr(WSHQWDNum)
                                    Close #1                                    Next WSHQWDNum                                    
                                    WSHQWD.SendData CByte(255)                       
                                                                                          
                                    MsgBox "接收数据完成!", vbInformation, "提示:"
                                                                                                          
                                    WSHQWD.Close
                                                                                                                                                                        
                      End IfEnd Sub

解决方案 »

  1.   

    用单步调试的方法调试,并用输出相关可疑数据进行分析.比如WDStrArr和ConnetByteWSHQWD上下界.
      

  2.   

    我怀疑WSHQWD.GetData ConnetByteWSHQWD() 没有值,是空数组.
      

  3.   

    报错时,看一下这个值是多少,WSHQWDNum  你在立即窗口里输入print WDStrArr(WSHQWDNum)  和 print ConnetByteWSHQWD(WSHQWDNum)
    看那一个报错你就知道是那个数组有问题了,在具体分析
      

  4.   

    For WSHQWDNum = 0 To bytesTotal - 1                                    WDStrArr(WSHQWDNum) = ConnetByteWSHQWD(WSHQWDNum)
    ......
      

  5.   

    ...............ReDim WDStrArr(0 To 4679)//For WSHQWDNum = 0 To bytesTotal - 1                                     WDStrArr(WSHQWDNum) = ConnetByteWSHQWD(WSHQWDNum).......你就那么地肯定bytesTotal - 1 = 4679?
      

  6.   

    你好,在监视窗口里显示:  ConnetByteWSHQWD(WSHQWDNum) 溢出然后,我测试用bytesTotal -1
    bytesTotal 取回来的是680,但是我在测试发过去的数据肯定是4680(即0-4679) BYTE
    请问WINSCOk有限制??如果有,也不应该那么低吧。。680 一K都不到~~!呵呵
      

  7.   


    你好,老马,
    bytesTotal 取回来的是680,但是我在测试发过去的数据肯定是4680(即0-4679) BYTE 
    请问如何解决这个问题可以一次接受4680 BYTES
      

  8.   

    你发了多少字节,接收并不一定是多少字节.或者说,基本上很少机率是发多少收多少.你应该先对所有收到的内容保存下来,然后再确定收到的是什么内容,再作处理.这需要你自己做一个协议.比如,一个包的结构:包头:   包大小,CRC,发送时间内容:   实际数据这样的话你在收到包头后,再继续地收包.直到收到那样大小,并对实际数据进行CRC测试后确认了再向主机请求下一次数据包的发送.你现在这样子发不能保证正常.
      

  9.   

    wisock会根据网络情况和数据大小自动分包,所以可能一次不会收到你所发的那么多,你应该根据发送的长度来确定是否接受完了.没接收完所有数据,继续接收,最后拼接成一个完整数据!
      

  10.   


    老马,按照你的意思,我就郁闷了。。
    请问难道WINSOCK 接收 不到半K的东西也不能一次接收完吗?? 
    才4680 byte,它才收到680 BYTE。。难道它一次最大只能收到680 BYTE吗??
    如果是这样,我若发10M过去不就得 1 2个小时??甚至不止??
    那请问WINSOCK传送文件的时候怎么办???
    用发包的协议?那它一次只能680BYTE。那我得发久阿??PS 我这边是上位机软件 连下面弹片机进行通信,是485串口接弹片机再通过一个小设备转TCPIP 连PC。是这样和下面弹片机进行通信、数据传输的。
      

  11.   

    你好,请问网络情况是指哪方面??数据大小?我问一下一次发4680BYTE,请问这是大数据还是小数据?
    还是WINSOCK 一次接收的总次数就是680? 所以不管是发STRING 还是 BYTE 都是最多680。
    因为一次只能收680。所以它才收到680BYTE??
    制用发包协议,来确定数据的完整性。如果这样可以做,但一次也只能收680BYTE,
    如果有10M 我有得发多久??
      

  12.   

    我记得LZ曾在http://topic.csdn.net/u/20090605/02/29095de0-92db-4ef4-9590-6e777a0fcaef.html提过类似的问贴,也是myjian回复的:
    回复于:2009-06-05 04:30:07
    ReDim a(43) As Byte  '去掉 
    让WINSOCK控件自己给你扩维. 
    每次收到的数据并不一定是你发多少收多少的. 
    你把每次的任何数据都收回来,然后再从中把有用的数据还原. 

    LZ在本贴中仍然犯同样的错误.
     
      

  13.   

    你好,看了上次的贴才知道,我上次也发过类似的问题,但上次那个问题其实我没有去掉
    ReDim a(43) As Byte 也解决了这个问题。。
    但是我想知道WINSOCK接收最大个数是多少??
    这能给出答案吗??
    但是,下面弹片机一次就发4680 BYTE过来。就发一次的话,
    我得怎么收???每次发来的数据都不同?我又得怎么判断??是否是它的数据?
    我最多只知道 4680 个BYTE。。
    请指教。。谢谢!!
      

  14.   

    你自己做一组简单的会话协议命令,比如要发的长度,类型等等。每个命令最后一个字符要用特殊的字符做结尾。接收方每次接到数据后检查最后一个字符是后特殊的结尾符。如果是,就分析提取相关数据。.........我用winsock做过完整的字符、文件传输软件,诚恳的说,这个控件还是相当好使的。这控件还是微软与其他公司合作开发的。
      

  15.   

     这里边大有文章,LZ怎么肯定就是 Winsock 控件的问题?WSHQWDNum 的报错时候的值你跟踪到了吗?
      

  16.   

    你要自己缓存数据到一个固定长度再处理winsock是这样的,你一次发出的数据会分块按顺序到达,每到一块会触发一次DataArrival事件,这个和winsock的底层实现有关