示例#1
0
文件: DPacket.cs 项目: KOLLSOFT/DNET
        /// <summary>
        /// 从一段数据流中从前至后查找数据包,返回第一个数据包的位置,如果出现第一个未接收完整的疑似包,
        /// 而该疑似包之后没有再发现下一个数据包,则传出这个疑似包的结果。
        /// </summary>
        /// <param name="data"></param>
        /// <param name="startIndex"></param>
        /// <returns></returns>
        private OnceFindResult FindPacketOnce(byte[] data, int startIndex)
        {
            OnceFindResult result        = new OnceFindResult();
            int            startSuspect  = 0;
            bool           isFindSuspect = false;

            for (int i = startIndex; i < data.Length; i++)
            {
                result = PacketCheck(data, i);
                if (result.e == PacketError.Succeed) //如果当前位置判断成功,就直接传出结果
                {
                    return(result);
                }
                else if (result.e == PacketError.PacketReceiveing && isFindSuspect == false)
                {
                    startSuspect  = i;
                    isFindSuspect = true;
                    break;
                }
                else if (result.e == PacketError.PacketLengthTooShort && isFindSuspect == false)
                {
                    startSuspect  = i;
                    isFindSuspect = true;
                    break;
                }
            }
            if (isFindSuspect)
            {
                return(PacketCheck(data, startSuspect));
            }
            else
            {
                return(result);
            }
        }
示例#2
0
        /// <summary>
        /// 检测测数据包是否正确的功能函数。输入一个判断位置,会检测包头,长度,包尾巴,然后返回结果。
        /// </summary>
        /// <param name="PacketData"></param>
        /// <param name="startIndex"></param>
        /// <returns></returns>
        private OnceFindResult PacketCheck(byte[] PacketData, int startIndex = 0)
        {
            OnceFindResult reslut = new OnceFindResult();

            reslut.startIndex = startIndex;

            if ((PacketData.Length - startIndex) < (head.Length + sizeof(int) + 0 + end.Length))
            {
                reslut.e = PacketError.PacketLengthTooShort;//长度就小于最小长度
                return(reslut);
            }
            //判断包头是否正确
            else if (!CheckHead(PacketData, startIndex))
            {
                reslut.e = PacketError.HeadError;//包头字节不对
                return(reslut);
            }
            int length = GetLength(PacketData, startIndex);//从数据包中得到长度

            if (startIndex + length > PacketData.Length)
            {
                reslut.e      = PacketError.PacketReceiveing;//长度位数据不对,还未收完整
                reslut.length = length;
                return(reslut);
            }
            if (!CheckEnd(PacketData, startIndex, length))
            {
                reslut.e = PacketError.EndError;//包尾字节不对
                return(reslut);
            }

            reslut.e      = PacketError.Succeed;
            reslut.length = length;
            return(reslut);
        }
示例#3
0
文件: DPacket.cs 项目: KOLLSOFT/DNET
 /// <summary>
 /// 输入一段有头尾的数据包,尝试拆出数据
 /// </summary>
 private byte[] UnPack(byte[] PData, OnceFindResult result)
 {
     if (result.e == PacketError.Succeed)
     {
         byte[] data = new byte[result.length - head.Length - sizeof(int) - sizeof(uint) - end.Length];
         Buffer.BlockCopy(PData, result.startIndex + head.Length + sizeof(int), data, 0, data.Length);
         return(data);
     }
     else
     {
         return(null);
     }
 }
示例#4
0
文件: DPacket.cs 项目: KOLLSOFT/DNET
        byte[] IPacket.UnPack(byte[] sData, int startIndex)
        {
            OnceFindResult result = PacketCheck(sData, startIndex);

            if (result.e == PacketError.Succeed)
            {
                byte[] data = new byte[result.length - head.Length - sizeof(int) - sizeof(uint) - end.Length];
                Buffer.BlockCopy(sData, result.startIndex + head.Length + sizeof(int), data, 0, data.Length);
                return(data);
            }
            else
            {
                return(null);
            }
        }
示例#5
0
文件: DPacket.cs 项目: KOLLSOFT/DNET
        /// <summary>
        /// 检测测数据包是否正确的功能函数。输入一个判断位置,会检测包头,长度,包尾巴,然后返回结果。
        /// </summary>
        /// <param name="PacketData"></param>
        /// <param name="startIndex"></param>
        /// <returns></returns>
        private OnceFindResult PacketCheck(byte[] PacketData, int startIndex = 0)
        {
            OnceFindResult reslut = new OnceFindResult();

            reslut.startIndex = startIndex;

            if ((PacketData.Length - startIndex) < (head.Length + sizeof(int) + 0 + sizeof(uint) + end.Length))
            {
                reslut.e = PacketError.PacketLengthTooShort;//长度就小于最小长度
                return(reslut);
            }
            //判断包头是否正确
            else if (!CheckHead(PacketData, startIndex))
            {
                reslut.e = PacketError.HeadError;//包头字节不对
                return(reslut);
            }
            int length = GetLength(PacketData, startIndex);

            if (startIndex + length > PacketData.Length)
            {
                reslut.e      = PacketError.PacketReceiveing;//长度位数据不对,还未收完整
                reslut.length = length;
                return(reslut);
            }
            if (!CheckEnd(PacketData, startIndex, length))
            {
                reslut.e = PacketError.EndError;//包尾字节不对
                return(reslut);
            }
            //如果设置进行CRC校验才进行校验,否则不校验。
            if (isCheckCRC)
            {
                uint crc = GetCRC(PacketData, startIndex, length);
                if (crc != Crc32.Crc(PacketData, startIndex, length - end.Length - sizeof(uint)))
                {
                    reslut.e = PacketError.CRCError;//CRC错误
                    return(reslut);
                }
            }
            reslut.e      = PacketError.Succeed;
            reslut.length = length;
            return(reslut);
        }