Esempio n. 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);
        }
Esempio n. 2
0
        /// <summary>
        /// 验证接收情况
        /// </summary>
        private void Check()
        {
            Console.WriteLine("check");
            Task.Factory.StartNew(() =>
            {
                resetEvent.WaitOne();
                long cur    = 0;
                bool sucess = false;
                for (int i = 0; i < buf.Length; i++)
                {
                    if (buf[i] != null)
                    {
                        Array.Copy(buf[i].data, 0, currten, cur, buf[i].data.Length);
                        cur += buf[i].data.Length;
                    }
                    if (cur == packageSum || cur >= MaxBufferSize)
                    {
                        //接收完成
                        // byte[] currten = new byte[packageSum];
                        sucess = true;
                        if (OnReviceData != null)
                        {
                            OnReviceData(this, id, currten, RecviceState.sucess);
                        }
                        break;
                    }
                    else
                    {
                        LosPackage tmp = new LosPackage()
                        {
                            packageType = 2, packageID = id, packageSeq = i
                        };
                        dicLosss[i] = tmp;
                        if ((DateTime.Now - LastTime).TotalSeconds > MaxWaitTime)
                        {
                            if (OnReviceData != null)
                            {
                                OnReviceData(this, id, null, RecviceState.fail);
                            }
                            sucess = true;
                        }
                        else
                        {
                            LosPackage[] lostTmp = new LosPackage[dicLosss.Count];
                            dicLosss.Values.CopyTo(lostTmp, 0);
                            OnLossData(this, remote, lostTmp);
                        }
                        break;
                    }
                }

                if (!sucess)
                {
                    Check();
                }
            });
        }
Esempio n. 3
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();
        }
Esempio n. 4
0
        private void Pool_OnReviceData(object sender, long id, byte[] data, RecviceState state)
        {
            //一组接收完成
            if (dicSucess.ContainsKey(id))
            {
                return;
            }
            dicSucess[id] = DateTime.Now;
            RecvicePool pool = null;

            dicPool.TryRemove(id, out pool);
            if (OnDataReceived != null)
            {
                AsyncUdpUserToken token = new AsyncUdpUserToken();
                token.Data   = data;
                token.Remote = remote;
                token.Length = data.Length;
                Task.Factory.StartNew(() =>
                {
                    OnDataReceived(this, token);
                });
                RecvicePool recvice = sender as RecvicePool;
                if (recvice != null)
                {
                    recvice.Clear();
                }
                recvice.OnLossData   -= Pool_OnLossData;
                recvice.OnReviceData -= Pool_OnReviceData;
                //完成发送一次
                LosPackage package = new LosPackage();
                package.packageType = 3;
                package.packageID   = id;
                Pool_OnLossData(this, remote, new LosPackage[] { package });

                Console.WriteLine("sucess:" + id);
            }
        }
Esempio n. 5
0
        /// <summary>
        /// 接收底层的数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="token"></param>
        private void UDPSocket_OnDataReceived(object sender, AsyncUdpUserToken token)
        {
            Console.WriteLine("接收数据个数:" + token.Length);
            switch (token.Data[token.Offset])
            {
            case 0:
            {
                //数据
                socketEndPoint.Add(token);
                if (isValidatePoint)
                {
                    isValidatePoint = false;
                    EndPointValidate();
                }
            }
            break;

            case 1:
            {
                //接收完成序列
                Console.WriteLine("接收小包完成返回");
                SendQueue  sendQueue = null;
                LosPackage rsp       = new LosPackage(token.Data);
                if (dicSendQueue.TryGetValue(rsp.packageID, out sendQueue))
                {
                    sendQueue.Add(rsp.packageSeq);
                }
            }
            break;

            case 2:
            {
                //丢失序列
                Console.WriteLine("接收丢失请求");
                SendQueue  sendQueue = null;
                LosPackage rsp       = new LosPackage(token.Data);
                if (dicSendQueue.TryGetValue(rsp.packageID, out sendQueue))
                {
                    AsyncUdpUserToken resend = sendQueue.GetAsyncUdpUserToken(rsp.packageSeq);
                    if (resend != null)
                    {
                        uDPPack.Send(resend, 0);
                    }
                }
            }
            break;

            case 3:
            {
                //完成接收

                SendQueue  sendQueue = null;
                LosPackage rsp       = new LosPackage(token.Data);
                if (dicSendQueue.TryRemove(rsp.packageID, out sendQueue))
                {
                    sendQueue.Clear();
                }
                Console.WriteLine("接收完成返回:" + rsp.packageID);
            }
            break;
            }
        }