/// <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); }
/// <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(); }
/// <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); } } } } }