public void receivePackage(byte[] package)
        {
            Guid g = UdpFrame.getGuid(package);

            lock (framesLock)
            {
                if (!frames.ContainsKey(g))
                {
                    frames[g] = new UdpFrame();
                }
                frames[g].addPackage(package);
            }
        }
        public UdpFrame getFrame()
        {
            UdpFrame ret = null;

            lock (framesLock)
            {
                ret = frames.Values.Where(t => t.complete && !t.dirty).OrderBy(t => t.receiveTime).LastOrDefault();
                if (ret != null)
                {
                    foreach (var item in frames.Where(t => t.Value.receiveTime < ret.receiveTime))
                    {
                        item.Value.dirty = true;
                    }
                    var now  = DateTime.Now;
                    var keys = frames.Where(t => t.Value == ret || (now - t.Value.receiveTime).TotalSeconds > 5).Select(t => t.Key).ToList();
                    foreach (var item in keys)
                    {
                        frames.Remove(item);
                    }
                }
            }
            return(ret);
        }