标题:VBCopyMemory下标越界
只看楼主
leziyi
Rank: 1
等 级:新手上路
帖 子:52
专家分:0
注 册:2016-10-30
结帖率:85.71%
已结贴  问题点数:20 回复次数:4 
VBCopyMemory下标越界
Private Sub GetTCPDatas()

   

  Dim TcpRow     As MIB_TCPROW

  Dim Buffer()     As Byte

  Dim LngRequired     As Long

  Dim LngStructureSize     As Long

  Dim LngRows     As Long

  Dim LngCounter     As Long

  Dim strTemps     As String

  Dim ListX     As ListItem

   

  LvwTcpTable.ListItems.Clear

  Call GetTcpTable(ByVal 0&, LngRequired, 1)

   

  If LngRequired > 0 Then

          ReDim Buffer(0 To LngRequired - 1) As Byte

          If GetTcpTable(Buffer(0), LngRequired, 1) = ERROR_SUCCESS Then

                  LngStructureSize = LenB(TcpRow)

   

                  '起始的四个字节,是做为表示进入点的数字

                  CopyMemory LngRows, Buffer(0), 4

                  For LngCounter = 1 To LngRows

   

                          '   将上述获得四个字节的相关数据,拷贝到   TcpRow   的结构之中

                          CopyMemory TcpRow, Buffer(4 + (LngCounter - 1) * LngStructureSize), LngStructureSize

                           

                          '   将结果传送到   ListView   之中

                          With TcpRow

                                  Set ListX = LvwTcpTable.ListItems.Add(, , GetInetAddrStr(.dwLocalAddr))
                                 
                                  ListX.SubItems(1) = .dwOwningPid

                                  ListX.SubItems(2) = ntohs(.dwLocalPort)

                                  ListX.SubItems(3) = GetInetAddrStr(.dwRemoteAddr)

                                  ListX.SubItems(4) = ntohs(.dwRemotePort)
                                 
                                  ListX.SubItems(5) = (.dwState)

                                  Select Case .dwState

                                          Case MIB_TCP_STATE_CLOSE_WAIT:         strTemps = "结束等待"

                                          Case MIB_TCP_STATE_CLOSED:                 strTemps = "已结束"

                                          Case MIB_TCP_STATE_CLOSING:               strTemps = "结束中..."

                                          Case MIB_TCP_STATE_DELETE_TCB:         strTemps = "已删除TCB"

                                          Case MIB_TCP_STATE_ESTAB:                   strTemps = "已连接"

                                          Case MIB_TCP_STATE_FIN_WAIT1:           strTemps = "FIN延时处理1"

                                          Case MIB_TCP_STATE_FIN_WAIT2:           strTemps = "FIN延时处理2"

                                          Case MIB_TCP_STATE_LAST_ACK:             strTemps = "上次取得的确认信号"

                                          Case MIB_TCP_STATE_LISTEN:                 strTemps = "监听中..."

                                          Case MIB_TCP_STATE_SYN_SENT:             strTemps = "传送"

                                          Case MIB_TCP_STATE_SYN_RCVD:             strTemps = "数据接收中"

                                          Case MIB_TCP_STATE_TIME_WAIT:           strTemps = "等候中..."

                                  End Select

                                  ListX.SubItems(5) = ListX.SubItems(4) & "(" & strTemps & ")"

                                  strTemps = ""

                          End With

                    

                  Next

            

          End If

  End If

  End Sub
搜索更多相关主题的帖子: Dim Buffer If Case End 
2018-12-13 19:08
leziyi
Rank: 1
等 级:新手上路
帖 子:52
专家分:0
注 册:2016-10-30
得分:0 
'   将上述获得四个字节的相关数据,拷贝到   TcpRow   的结构之中

                          CopyMemory TcpRow, Buffer(4 + (LngCounter - 1) * LngStructureSize), LngStructureSize-----------------------------错误行
2018-12-13 19:08
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:10 
下标越界,说明引用的数据超过了数组范围。而你的数组是一个动态数组,由TCP数据生成。
那么说明,你引用时TCP生成的数组,还没有到达一个范围。
1、代码里需要对引用范围进行判断。这是一个健壮程序的基本要求。
2、TCP数据,有可能连包,分包,需要针对这二种情况分别处理。
TCP数据并不是一个数据包立即完整发出来,也有可能几个小数据段 封装成一个数据包发出来。


授人于鱼,不如授人于渔
早已停用QQ了
2018-12-14 11:28
leziyi
Rank: 1
等 级:新手上路
帖 子:52
专家分:0
注 册:2016-10-30
得分:0 
那为什么这段代码在别的程序里又能运行
2018-12-14 13:35
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:10 
产生的原因是 TCP 连接里出现了分包和连包。
分包,一个完整数据包,被分成多个发出去,客户端会产生2次或以上收到数据的事件。需要把每次判断收到的数据包是否完整,如果不完整,需要等待下一次的数据包,然后拼接到一起再进行处理 。
连包,二个或多个完整的短数据包,被合并成一个数据发出去,客户端只能收到一次收到数据的事件,但这里数据包是二个或多个完整的数据包。需要先分隔成一个一个的数据钮,再进行处理。

这二种情况有可能混合出现。
也就是说,这次收到的数据,可能是 二个半包的数据,然后下一个就是半包加几个完整包的数据。

授人于鱼,不如授人于渔
早已停用QQ了
2018-12-14 15:54



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-492007-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.735605 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved