atfeel
V2EX  ›  C#

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

  •  
  •   atfeel · Oct 2, 2022 · 2153 views
    This topic created in 1319 days ago, the information mentioned may be changed or developed.
    以下是读取 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 个小时左右就会报这个错。不知道是什么原因。。。
    试了各种方法都无法解决。。头疼
    4 replies    2022-10-02 23:17:27 +08:00
    BrettD
        1
    BrettD  
       Oct 2, 2022 via iPhone
    有没有可能是真的 OutOfMemoryException……
    atfeel
        2
    atfeel  
    OP
       Oct 2, 2022
    @BrettD 这个代码已经是相当简单了,我实在检查不出内存出现异常。不知道大家是怎么写粘连包的
    qianlv7
        3
    qianlv7  
       Oct 2, 2022 via iPhone
    越界了啊,假设 count == len 情况,GetRange 的范围[4 ,len+4 )啊,
    qianlv7
        4
    qianlv7  
       Oct 2, 2022 via iPhone
    实际收到只有 len ,而 len+4 就越界了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1854 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 16:16 · PVG 00:16 · LAX 09:16 · JFK 12:16
    ♥ Do have faith in what you're doing.