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