c#粘包半包处理

有一些代码还没补上。基本结构定好了。
每个包都是四个字节的包体长度+包体数据

using System;
using System.Collections.Generic;
using System.Text;

namespace VoxelServer.Network
{
    class ClientMessageHandler
    {
        const int BUFFER_SIZE = 1024;
        public byte[] buffer = new byte[BUFFER_SIZE];
        public int beginIndex = 0;
        int bodyLen = -1;//记录读出的bodylen。-1即为未读.每次处理完数据体后都要置-1
        public int leftSize
        {
            get
            {
                return BUFFER_SIZE-beginIndex;
            }
        }

        public byte[] incompleteBody;//用来存储之前接收但没接受全的数据体
        public void handleReceive(int dataLen)
        {
            int handledLen=0;//记录已经处理的数据长度。等价于下一步数据从哪开始.处理完数据就要+1
            while (handledLen!=dataLen)
            {
                if (incompleteBody == null)//判断是否存在未接收完的数据体,不存在即先读取数据头(数据体长度int32)
                {
                    if (dataLen-handledLen < 4)//判断长度是否达到int32,不到直接return,继续下一次接收。
                    {
                        beginIndex += dataLen - handledLen;
                        if (handledLen>0)
                        {
                            Array.Copy(buffer,0,buffer, handledLen, dataLen - handledLen);
                        }
                        return;
                    }
                    else
                    {
                        bodyLen = BitConverter.ToInt32(buffer, handledLen);
                        handledLen += 4;
                        if (bodyLen > dataLen - handledLen)//数据体长度大于未处理数据长度,把数据体存入previousData
                        {
                            //存入incompleteBody

                            return;
                        }
                        else
                        {
                            //处理数据体

                            //处理完后
                            handledLen += bodyLen;
                            resetBodyLen();
                        }
                    }
                }
                else
                {
                    int leftBodyLen = bodyLen - incompleteBody.Length;
                    if (leftBodyLen > dataLen)
                    {
                        //存入incompleteBody

                        return;
                    }
                    else
                    {
                        //组合数据体

                        //处理数据体

                        //处理完后
                        handledLen += leftBodyLen;
                        resetBodyLen();
                        incompleteBody = null;
                    }
                }
            }
        }
        private void resetBodyLen()
        {
            bodyLen = -1;
        }
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值