Beispiel #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="package"></param>
        /// <returns></returns>
        public List <LosPackage> Add(UDPDataPackage package)
        {
            if (currten == null)
            {
                if (package.packageSum < MaxBufferSize)
                {
                    currten = new byte[package.packageSum];
                }
                else
                {
                    currten = new byte[MaxBufferSize];
                }
            }
            LastTime = DateTime.Now;
            if (buf == null)
            {
                return(null);
            }
            if (buf[package.packageSeq] == null)
            {
                buf[package.packageSeq] = new RecviceBuffer()
                {
                    data = package.data
                };
                sum += package.data.Length;
            }
            packageSum = package.packageSum;
            id         = package.packageID;
            List <LosPackage> list = new List <LosPackage>();
            LosPackage        rec  = new LosPackage()
            {
                packageID = package.packageID, packageSeq = package.packageSeq, packageType = 1
            };

            if (package.packageSeq != 0)
            {
                if (max < package.packageSeq - 1)
                {
                    for (int i = max + 1; i < package.packageSeq; i++)
                    {
                        LosPackage tmp = new LosPackage()
                        {
                            packageType = 2, packageID = package.packageID, packageSeq = i
                        };
                        dicLosss[i] = tmp;
                        list.Add(tmp);
                    }
                    max = package.packageSeq;
                }
            }
            list.Add(rec);
            dicLosss.Remove(package.packageSeq);
            if (sum >= packageSum)
            {
                resetEvent.Set();
            }
            return(list);
        }
Beispiel #2
0
        /// <summary>
        /// 保持数据
        /// </summary>
        /// <param name="package"></param>
        public void Add(UDPDataPackage package)
        {
            RecvicePool pool = null;

            //排除重复
            if (dicSucess.ContainsKey(package.packageID))
            {
                LosPackage los = new LosPackage();
                los.packageType = 3;
                los.packageID   = package.packageID;
                SendBack(new LosPackage[] { los });
                return;//无用数据了;
            }
            if (dicPool.TryGetValue(package.packageID, out pool))
            {
                List <LosPackage> result = pool.Add(package);
                if (result != null)
                {
                    Pool_OnLossData(this, remote, result.ToArray());
                    result.Clear();
                }
            }
            else
            {
                pool                       = new RecvicePool(package.PackageNum);
                pool.remote                = remote;
                pool.OnLossData           += Pool_OnLossData;
                pool.OnReviceData         += Pool_OnReviceData;
                dicPool[package.packageID] = pool;
                List <LosPackage> result = pool.Add(package);
                if (result != null)
                {
                    Pool_OnLossData(this, remote, result.ToArray());
                    result.Clear();
                }
            }
            CheckSucess();
        }
Beispiel #3
0
        /// <summary>
        /// 添加数据
        /// </summary>
        /// <param name="token"></param>
        public void Add(AsyncUdpUserToken token)
        {
            IPEndPoint endPoint = token.Remote as IPEndPoint;

            if (null != endPoint)
            {
                string key = endPoint.Address.ToString() + endPoint.Port;
                dicRecvice[key] = DateTime.Now;
                RecviceData    data    = null;
                UDPDataPackage package = new UDPDataPackage();
                package.UnPack(token.Data, token.Offset, token.Length);
                if (dicPool.TryGetValue(key, out data))
                {
                    data.Add(package);
                }
                else
                {
                    lock (lock_obj)
                    {
                        //阻塞创建
                        if (!dicPool.TryGetValue(key, out data))
                        {
                            data                 = new RecviceData();
                            dicPool[key]         = data;
                            data.remote          = endPoint;
                            data.OnDataReceived += Data_OnDataReceived;
                            data.OnLossData     += Data_OnLossData;
                            data.Add(package);
                        }
                        else
                        {
                            data.Add(package);
                        }
                    }
                }
            }
        }