private void Decode()
        {
            while (true)
            {
                if (ibuffer.Size < 8)
                {
                    break;
                }

                int type = ibuffer.pop_int();
                int size = ibuffer.pop_int();

                if (size > ibuffer.Capacity - 8)
                {
                    throw new Exception("message size error: " + size);
                }

                if (size <= ibuffer.Size)
                {
                    Message msg = manager.CreateMessage(type);
                    if (msg == null)
                    {
                        manager.onUnknownMessage(this, type, size, ibuffer);
                        continue;
                    }

                    msg.unmarshal(ibuffer);
                    msg.setSession(this);

                    try
                    {
                        msg.dispatch();
                    }
                    catch
                    {
                    }
                }
                else
                {
                    ibuffer.pop_rollback(8);
                    break;
                }
            }
        }