コード例 #1
0
        /// <summary>
        /// 将接收到的字节转成数据包
        /// </summary>
        /// <param name="packs">数据包列表</param>
        /// <param name="e">接收数据</param>
        /// <param name="littleEndian">小端</param>
        /// <param name="maxPackageSize">最大包大小</param>
        /// <returns>数据包数 -1为非法数据包</returns>
        public IList <INetPackage> Parse(AsyncSocketTokenEventArgs e, bool littleEndian = true, int maxPackageSize = 10240)
        {
            //lock (((ICollection)lockers).SyncRoot) {}
            if (!lockers.ContainsKey(e.ConnectionID))
            {
                lockers[e.ConnectionID] = new object();
            }

            lock (lockers[e.ConnectionID]) {
                if (cache.ContainsKey(e.ConnectionID))
                {
                    cache[e.ConnectionID] = EndianHelper.UnionBytes(cache[e.ConnectionID], e.ReceivedBytes);
                }
                else
                {
                    cache[e.ConnectionID] = EndianHelper.UnionBytes(null, e.ReceivedBytes);
                }

                byte[] data  = cache[e.ConnectionID];
                int    count = data.Length;
                if (count <= 4)
                {
                    return(new List <INetPackage>());
                }
                if (count > maxPackageSize)
                {
                    return(null);
                }

                IList <INetPackage> packs = new List <INetPackage>();
                while (count > 4)
                {
                    byte[] lenBytes = new byte[4];
                    Buffer.BlockCopy(data, 0, lenBytes, 0, 4);

                    StructPackageLength lenPack = EndianHelper.BytesToStruct <StructPackageLength>(lenBytes);
                    int length = lenPack.Size;
                    if (length > 0 && count >= length + 14)
                    {
                        byte[] bytes = new byte[10240 + 10 + 4];
                        Buffer.BlockCopy(data, 0, bytes, 0, length + 14);
                        StructPackageData packData = EndianHelper.BytesToStruct <StructPackageData>(bytes);

                        byte[] resultBytes = new byte[packData.Size];
                        Buffer.BlockCopy(packData.Bytes, 0, resultBytes, 0, packData.Size);
                        System.IO.MemoryStream resultStream = new System.IO.MemoryStream(resultBytes);

                        StructPackage pack = new StructPackage();
                        pack.Command = packData.Command;
                        pack.Stream  = new StreamReader(resultStream, littleEndian);
                        packs.Add(pack);

                        byte[] data2 = new byte[count - length - 14];
                        Buffer.BlockCopy(data, length + 14, data2, 0, count - length - 14);
                        count = count - length - 14;
                        data  = data2;
                        cache[e.ConnectionID] = data;
                    }
                    else
                    {
                        if (length < 0)
                        {
                            cache[e.ConnectionID] = null;
                        }
                        return(packs);
                    }
                }
                return(packs);
            }
        }
コード例 #2
0
 /// <summary>
 /// Reads different information from the header.
 /// </summary>
 protected override void ReadHeaderInfo()
 {
     Headers.Add(FILEHEADERNAME, EndianHelper.BytesToStruct <FileHeader>(RawData.SubArray(0, 14)));
 }
コード例 #3
0
 /// <summary>
 /// 返回数据包里的消息
 /// </summary>
 /// <typeparam name="T">结构体</typeparam>
 /// <returns></returns>
 public T NetMessage <T>() where T : INetMessage, new()
 {
     return(EndianHelper.BytesToStruct <T>(Stream.ReadBytes((int)Stream.Length)));
 }