Foxtable(狐表)用户栏目专家坐堂 → [求助]socket代码无规律出现索引超出范围的错误。是哪里有问题了


  共有2136人关注过本帖树形打印复制链接

主题:[求助]socket代码无规律出现索引超出范围的错误。是哪里有问题了

帅哥哟,离线,有人找我吗?
54292550
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:279 积分:4092 威望:0 精华:0 注册:2011/8/19 10:07:00
[求助]socket代码无规律出现索引超出范围的错误。是哪里有问题了  发帖心情 Post By:2020/6/28 14:10:00 [只看该作者]

全局代码:
Public socket As MyClient
Public Class MyClient
Public receiveThread As System.Threading.Thread
Public nStream As System.Net.Sockets.NetworkStream
Public tcp As  System.Net.Sockets.TcpClient
Public Sub New(ByVal ip As String, ByVal port As Integer)
Dim server As System.Net.IPAddress = System.Net.IPAddress.Parse(ip)
tcp = New System.Net.Sockets.TcpClient()
Try
    tcp.Connect(ip, port)
Catch generatedExceptionName As Exception
    tcp = Nothing
End Try
If tcp Is Nothing Then
    MsgBox("无法连接服务器,请重试")
Else
    Dim netStream As System.Net.Sockets.NetworkStream = tcp.GetStream()
    nStream = netStream
    receiveThread = New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf ReceiveMsg))
    receiveThread.IsBackground=True
    receiveThread.Start()
End If
End Sub
Private Sub ReceiveMsg()
While True
    Dim packet As Byte() = New Byte(1024) {}
    nStream.Read(packet, 0, packet.Length)
    If HEX(packet(7)) = "3" Then
        Vars("D128") = packet(10)
        Vars("D129") = packet(12)
        Vars("D130") = packet(14)
        Vars("D131") = packet(16)
        Vars("D132") = packet(18)
        Vars("D133") = packet(20)
        Vars("D134") = packet(22)
        Vars("D135") = packet(24)
    Else
       
    End If
End While
End Sub
End Class



为什么偶尔会出现

“索引超出范围.必须为非负值并小于集合大小。参数名:index

这样的错误?有时候好长时间不出现,有时候偶尔就出现几次这样的报错。



[此贴子已经被作者于2020/6/28 14:10:10编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106209 积分:540168 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/6/28 14:15:00 [只看该作者]

比如接收的数据没有25个字符那么多,packet(24)这样肯定就有这种错误

 回到顶部
帅哥哟,离线,有人找我吗?
54292550
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:279 积分:4092 威望:0 精华:0 注册:2011/8/19 10:07:00
  发帖心情 Post By:2020/6/28 15:59:00 [只看该作者]

蓝老师,可能是因为网络数据包不稳定吧,这个怎么避免接收到的数据不够那么多个字符呢?如何判断一下然后我再赋值呢?

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106209 积分:540168 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/6/28 16:20:00 [只看该作者]

msgbox(packet.length)

 回到顶部
帅哥哟,离线,有人找我吗?
54292550
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:279 积分:4092 威望:0 精华:0 注册:2011/8/19 10:07:00
  发帖心情 Post By:2020/6/28 18:24:00 [只看该作者]

Dim packet As Byte() = New Byte(1024) {}
nStream.Read(packet, 0, packet.Length)
IF packet.length > 40 then
    If HEX(packet(7)) = "3"  Then
        Vars("D128") = packet(10)
        Vars("D129") = packet(12)
        Vars("D130") = packet(14)
        Vars("D131") = packet(16)
        Vars("D132") = packet(18)
        Vars("D133") = packet(20)
        Vars("D134") = packet(22)
        Vars("D135") = packet(24)
       Else
       
    End If
End



Dim packet As Byte() = New Byte(1024) {}
这个已经声明了一个固定长度的数组了,这个packet.length始终是1025啊。

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106209 积分:540168 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/6/28 20:19:00 [只看该作者]

https://docs.microsoft.com/zh-cn/dotnet/api/system.net.sockets.networkstream.read?view=netframework-4.6

把代码都包到try catch里面,跟踪一下看抛出什么详细的异常

 回到顶部
帅哥哟,离线,有人找我吗?
54292550
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:279 积分:4092 威望:0 精华:0 注册:2011/8/19 10:07:00
  发帖心情 Post By:2020/6/29 12:25:00 [只看该作者]

蓝老师,Var全局变量,我用了好几个计划在里面赋值操作,会不会是赋值产生冲突造成那个超出数组界限得报错?因为有时候还不是那个socket代码里面报得。我感觉好像是给赋值全局变量得时候报得。

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106209 积分:540168 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/6/29 13:29:00 [只看该作者]

改为使用public变量

 回到顶部