public void ProcessBytes(Session Session, ref byte[] Bytes)
        {
            if (Session == null)
            {
                return;
            }

            var ProcessType = ChooseProcessType(ref Bytes);

            switch (ProcessType)
            {
                case ByteProcessType.Unknown:
                    return;
                case ByteProcessType.Policy:
                    HandlePolicy(Session);
                    return;
                case ByteProcessType.Single:
                    HandleSingle(Session,true, ref Bytes);
                    return;
                case ByteProcessType.Multi:
                    HandleMulti(Session, ref Bytes);
                    return;
            }
        }
        public bool OptainSendObject(Session Session, out SocketAsyncEventArgs SendArgs)
        {
            this.SemaphoreOfSendSAEA.Wait();

            if (this.PoolOfSendSAEA.TryPop(out SendArgs))
            {
                SendArgs.AcceptSocket = Session.Socket;
                return true;
            }
            else
            {
                return false;
            }
        }
 private void HandlePolicy(Session Session)
 {
     Session.Write(PolicyResponse);
     Session.Push();
 }
        private void HandleSingle(Session Session, bool Scratch, ref byte[] Bytes)
        {
            using (var Reader = new BinaryReader(new MemoryStream(Bytes, false)))
            {
                var Index = Bytes.Length;

                if (Scratch)
                {
                    Index = Base64Encoding.DecodeInt32(Reader.ReadBytes(3));
                }

                var Header = (short)Base64Encoding.DecodeInt32(Reader.ReadBytes(2));
                var Content = Reader.ReadBytes(Index - 2);

                if (MessageEvents.ContainsKey(Header))
                {
                    Framework.Get<LogComponent>().BlurLine("MSG", ConsoleColor.Green, "[{0}] {1}", ConsoleColor.White, Header, MessageEvents[Header].ToString().Split('.').Last());
                    MessageEvents[Header].Invoke(Session, new MessageEvent(Header, Content));
                    Session.Push();
                }
                else if (UnknownMessageEvents.ContainsKey(Header))
                {
                    Framework.Get<LogComponent>().BlurLine("MSG", ConsoleColor.Gray, "[{0}] {1}", ConsoleColor.White, Header, UnknownMessageEvents[Header]);
                }
                else
                {
                    Framework.Get<LogComponent>().BlurLine("MSG", ConsoleColor.Red, "[{0}] Unknown", ConsoleColor.White, Header);
                }
            }
        }
        private void HandleMulti(Session Session, ref byte[] Bytes)
        {
            using (var Reader = new BinaryReader(new MemoryStream(Bytes,false)))
            {
                for (int i = 0; i < Bytes.Length; )
                {
                    var Index = Base64Encoding.DecodeInt32(Reader.ReadBytes(3)); i += 3;
                    var SingleBytes = Reader.ReadBytes(Index); i += Index;

                    HandleSingle(Session, false, ref SingleBytes);
                }
            }
        }