以文本方式查看主题 - Foxtable(狐表) (http://www.foxtable.com/bbs/index.asp) -- 专家坐堂 (http://www.foxtable.com/bbs/list.asp?boardid=2) ---- [求助]socket代码无规律出现索引超出范围的错误。是哪里有问题了 (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=151571) |
-- 作者:54292550 -- 发布时间:2020/6/28 14:10:00 -- [求助]socket代码无规律出现索引超出范围的错误。是哪里有问题了 全局代码: 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编辑过]
|
-- 作者:有点蓝 -- 发布时间:2020/6/28 14:15:00 -- 比如接收的数据没有25个字符那么多,packet(24)这样肯定就有这种错误 |
-- 作者:54292550 -- 发布时间:2020/6/28 15:59:00 -- 蓝老师,可能是因为网络数据包不稳定吧,这个怎么避免接收到的数据不够那么多个字符呢?如何判断一下然后我再赋值呢? |
-- 作者:有点蓝 -- 发布时间:2020/6/28 16:20:00 -- msgbox(packet.length) |
-- 作者:54292550 -- 发布时间: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" ThenVars("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啊。
|
-- 作者:有点蓝 -- 发布时间: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 -- 发布时间:2020/6/29 12:25:00 -- 蓝老师,Var全局变量,我用了好几个计划在里面赋值操作,会不会是赋值产生冲突造成那个超出数组界限得报错?因为有时候还不是那个socket代码里面报得。我感觉好像是给赋值全局变量得时候报得。 |
-- 作者:有点蓝 -- 发布时间:2020/6/29 13:29:00 -- 改为使用public变量 |