Socket 接收字节报错: System.OutOfMemoryException:“Exception_WasThrown”

2022-10-02 01:12:08 +08:00
 atfeel
以下是读取 Socket 的粘连接收代码

private List<byte> PacketData = new List<byte>();//包池
private void OnReceive(Socket client, byte[] bytes)
{
PacketData.AddRange(bytes);//添加数据
while (true)
{
if (PacketData.Count < 4) return; //数据不够读取包长,响应字节留给下一次在读取
byte[] contentLenBytes = PacketData.GetRange(0, 4).ToArray();//前 4 字节是包长
int len = BitConverter.ToInt32(contentLenBytes, 0);//转换 int

if (PacketData.Count < len) return;//包长不完整,就忽略本次读取,留给下一次读取




//这句报错:System.OutOfMemoryException:“Exception_WasThrown”
var pack = PacketData.GetRange(4, len);//读取包内容




byte[] fullData = pack.ToArray();

PacketData.RemoveRange(0, len+4);//移除已读取的内容
}
}



上面 var pack = PacketData.GetRange(4, len);这句报 System.OutOfMemoryException:“Exception_WasThrown”的错,一开始运行正常,当运行 2 个小时左右就会报这个错。不知道是什么原因。。。
试了各种方法都无法解决。。头疼
1177 次点击
所在节点    C#
4 条回复
BrettD
2022-10-02 02:04:31 +08:00
有没有可能是真的 OutOfMemoryException……
atfeel
2022-10-02 10:42:23 +08:00
@BrettD 这个代码已经是相当简单了,我实在检查不出内存出现异常。不知道大家是怎么写粘连包的
qianlv7
2022-10-02 23:16:00 +08:00
越界了啊,假设 count == len 情况,GetRange 的范围[4 ,len+4 )啊,
qianlv7
2022-10-02 23:17:27 +08:00
实际收到只有 len ,而 len+4 就越界了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/884298

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX