UDP分包组包

    [Serializable]
    public class UDPPackage
    {
        /// <summary>
        /// 包中的二进制数据
        /// </summary>
        public byte[] Bytes { get; set; }
        /// <summary>
        /// 所属包集合的编号
        /// </summary>
        public int PacketSerializedId { get; set; }
        /// <summary>
        /// 所属包集合中的第几个包
        /// </summary>
        public int PacketIndex { get; set; }
        /// <summary>
        /// 当前包分包的个数
        /// </summary>
        public int PacketCount { get; set; }
    }

分包

        //每个包中二进制数组的长度
        public static int len = 20480;
        //分包的方法,传入一个byte数组和包的编号(编号是用来判断收到数据是否是同一个包的)
        public static List<UDPPackage> GetList(byte[] bytes, int id)
        {
            if (bytes==null||bytes.Length==0) return null;
            List<UDPPackage> packages = new List<UDPPackage>();
            //int index = 0;//用来记录包在包集合中的位置
            int count = bytes.Length / len;//分包后集合包的数量
            if (bytes.Length % len > 0) count++;
            for (int i = 0; i < count; i++)
            {
                int all = len;
                if (i == count - 1)
                {
                    all = bytes.Length - i * len;
                }
                byte[] bs = new byte[all];
                Buffer.BlockCopy(bytes, i * len, bs, 0, all);
                packages.Add(new UDPPackage
                {
                    Bytes = bs,
                    PacketIndex = i,
                    PacketSerializedId = id,
                    PacketCount = count
                });
            }
            return packages;
        }

组包:

        static List<UDPPackage> udps = new List<UDPPackage>();
        public static byte[] GetBytes(UDPPackage package, int count)
        {
            List<byte> bytes = new List<byte>();
            udps.Add(package);
            //linq查询,查出包集合中所有和传入包编号拥有相同编号的包,并根据所在包
            //的位置排序
            var result = from n in udps
                         where n.PacketSerializedId == count
                         orderby n.PacketIndex
                         select n;
            //判断查出包的集合是否跟分包时的数量一样
            if (result.Count() == package.PacketCount)
            {
                foreach (var item in result)
                {
                    bytes.AddRange(item.Bytes);
                }
                //调用清包方法,清除所有组包完成的包
                clear(count);
                return bytes.ToArray();
            }
            else
            {
                return null;
            }
        }

        //清除方法,根据传入的包编号删除所有包集合中拥有此包编号的包
        private static void clear(int index)
        {
            for (int i = 0; i < udps.Count;)
            {
                //判读包的编号是否已传入的编号相同
                //如果相同则删除,否则进入下一个
                if (udps[i].PacketSerializedId == index)
                    udps.Remove(udps[i]);
                else
                    i++;
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值