以下是读取 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 个小时左右就会报这个错。不知道是什么原因。。。
试了各种方法都无法解决。。头疼
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 个小时左右就会报这个错。不知道是什么原因。。。
试了各种方法都无法解决。。头疼