Exemplo n.º 1
0
        public static void Process(RPCSpecialHolder pkg)
        {
            var type = (PackageType)pkg.PkgType;

            switch (type)
            {
            case PackageType.PKGT_C2P_Player_SendAndWait:
            {
                System.Object retObject = RPCEntrance.Execute(pkg.mForward.LimitLevel, pkg.mForward.Planes2GateConnect, pkg.mRoot, pkg, pkg.mForward);
                if (retObject == null || retObject.GetType() == typeof(void))
                {
                    break;
                }
                var retPkg = new PackageWriter();
                retPkg.SerialId = pkg.SerialId;
                retPkg.WritePODObject(retObject);
                retPkg.Write(pkg.mForward.Handle);
                retPkg.DoReturnCommand(pkg.mForward.Planes2GateConnect, CommandTargetType.Planes);
            }
            break;

            case PackageType.PKGT_C2P_Player_Send:
            {
                System.Object retObject = RPCEntrance.Execute(pkg.mForward.LimitLevel, pkg.mForward.Planes2GateConnect, pkg.mRoot, pkg, pkg.mForward);
            }
            break;
            }
        }
Exemplo n.º 2
0
 public void Write(PackageWriter pkg)
 {
     //int begin = pkg->GetPosition();
     pkg.Write(LimitLevel);
     pkg.Write(Handle);
     pkg.Write(PlayerIndexInMap);
     pkg.Write(MapIndexInServer);
     pkg.Write(RoleId);
     //System::Diagnostics::Debug::Assert(pkg->GetPosition()-begin==RPCForwardInfo::GetBlockSize());
 }
Exemplo n.º 3
0
 public virtual void PackageWrite(PackageWriter pkg)
 {
     if (pkg.IsSinglePkg)
     {
         PackageWriteSingle(pkg);
     }
     else
     {
         PackageWriteFull(pkg);
     }
 }
Exemplo n.º 4
0
        public virtual void PackageWriteFull(PackageWriter pkg)
        {
            var desc = IAutoSLClassDescManager.Instance.GetClassDesc(this.GetType());

            foreach (IAutoSLField f in desc.Fields)
            {
                var i = f.Property;

                if (WritePkg(pkg, i))
                {
                }
                else if (i.PropertyType.IsSubclassOf(typeof(IAutoSaveAndLoad)))
                {
                    var obj = (IAutoSaveAndLoad)(i.GetValue(this, null));
                    pkg.Write(obj);
                }
            }
        }
Exemplo n.º 5
0
        protected bool WritePkg(PackageWriter pkg, System.Reflection.PropertyInfo i)
        {
            var propType = i.PropertyType;

            if (propType == typeof(System.SByte))
            {
                pkg.Write(System.Convert.ToSByte(i.GetValue(this, null)));
            }
            else if (propType == typeof(System.Int16))
            {
                pkg.Write(System.Convert.ToInt16(i.GetValue(this, null)));
            }
            else if (propType == typeof(System.Int32))
            {
                pkg.Write(System.Convert.ToInt32(i.GetValue(this, null)));
            }
            else if (propType == typeof(System.Int64))
            {
                pkg.Write(System.Convert.ToInt64(i.GetValue(this, null)));
            }
            else if (propType == typeof(System.Byte))
            {
                pkg.Write(System.Convert.ToByte(i.GetValue(this, null)));
            }
            else if (propType == typeof(System.UInt16))
            {
                pkg.Write(System.Convert.ToUInt16(i.GetValue(this, null)));
            }
            else if (propType == typeof(System.UInt32))
            {
                pkg.Write(System.Convert.ToUInt32(i.GetValue(this, null)));
            }
            else if (propType == typeof(System.UInt64))
            {
                pkg.Write(System.Convert.ToUInt64(i.GetValue(this, null)));
            }
            else if (propType == typeof(System.Single))
            {
                pkg.Write(System.Convert.ToSingle(i.GetValue(this, null)));
            }
            else if (propType == typeof(System.Double))
            {
                pkg.Write(System.Convert.ToDouble(i.GetValue(this, null)));
            }
            else if (propType == typeof(System.Guid))
            {
                System.Guid id = (System.Guid)(i.GetValue(this, null));
                pkg.Write(id);
            }
            else if (propType == typeof(SlimDX.Vector2))
            {
                SlimDX.Vector2 id = (SlimDX.Vector2)(i.GetValue(this, null));
                pkg.Write(id);
            }
            else if (propType == typeof(SlimDX.Vector3))
            {
                SlimDX.Vector3 id = (SlimDX.Vector3)(i.GetValue(this, null));
                pkg.Write(id);
            }
            else if (propType == typeof(SlimDX.Vector4))
            {
                SlimDX.Vector4 id = (SlimDX.Vector4)(i.GetValue(this, null));
                pkg.Write(id);
            }
            else if (propType == typeof(SlimDX.Quaternion))
            {
                SlimDX.Quaternion id = (SlimDX.Quaternion)(i.GetValue(this, null));
                pkg.Write(id);
            }
            else if (propType == typeof(SlimDX.Matrix))
            {
                SlimDX.Matrix id = (SlimDX.Matrix)(i.GetValue(this, null));
                pkg.Write(id);
            }
            else if (propType == typeof(System.DateTime))
            {
                System.DateTime id = (System.DateTime)(i.GetValue(this, null));
                pkg.Write(id);
            }
            else if (propType == typeof(System.String))
            {
                System.String str = (System.String)(i.GetValue(this, null));
                pkg.Write(str);
            }
            else if (propType == typeof(System.Byte[]))
            {
                System.Byte[] str = (System.Byte[])(i.GetValue(this, null));
                pkg.Write(str);
            }
            else
            {
                return(false);
            }
            return(true);
        }
Exemplo n.º 6
0
        protected void ReceiveData(Iocp.NetConnection sender, byte[] pData, int nLength)
        {
            var pkg = new PackageProxy(pData, nLength);

            System.UInt16 serialId = pkg.SerialId;

            RPCForwardInfo fwd = null;

            if (mGateServerForward != null)
            {
                fwd = mGateServerForward.GetForwardInfo(sender);
            }

            Iocp.TcpConnect tcpConnect = sender as Iocp.TcpConnect;

            int LimitLevel = (int)RPCExecuteLimitLevel.Developer;

            if (tcpConnect != null)
            {
                LimitLevel = tcpConnect.mLimitLevel;
            }

            //只有对外的GateServer才需要判断权限,更新最高权限
            if (fwd != null)
            {
                LimitLevel = fwd.LimitLevel;
            }

            if (fwd != null && (PackageType)pkg.PkgType >= PackageType.PKGT_C2P_Send)
            {
                switch ((PackageType)pkg.PkgType)
                {
                case PackageType.PKGT_C2P_Send:
                case PackageType.PKGT_C2P_Player_Send:
                {
                    Iocp.NetConnection conn = fwd.Gate2PlanesConnect;
                    if (conn != null)
                    {
                        var fwdPkg = new PackageWriter(pData, nLength);
                        fwd.Write(fwdPkg);
                        fwdPkg.SendBuffer(conn);
                    }
                }
                    return;

                case PackageType.PKGT_C2P_SendAndWait:
                case PackageType.PKGT_C2P_Player_SendAndWait:
                {
                    Iocp.NetConnection conn = fwd.Gate2PlanesConnect;
                    if (conn != null)
                    {
                        var fwdPkg = new PackageWriter(pData, nLength);
                        fwd.Write(fwdPkg);
                        fwdPkg.SendBuffer(conn);
                    }
                }
                    return;

                case PackageType.PKGT_C2P_Return:
                {
                    if (mGateServerForward == null)
                    {
                        Log.Log.Common.Print("肯定有人改分包了,不是Gate但是收到PKGT_C2P_Return");
                    }
                    System.UInt16 handle;
                    //pkg.SeekTo(nLength-sizeof(RPCHeader)-sizeof(System.UInt16));
                    pkg.SeekTo(nLength - PackageProxy.HeaderSize - sizeof(System.UInt16));
                    pkg.Read(out handle);
                    pkg.SeekTo(0);
                    Iocp.NetConnection conn = mGateServerForward.GetConnectByHandle(handle);
                    if (conn != null)
                    {
                        var fwdPkg = new PackageWriter(pData, nLength - sizeof(System.UInt16));
                        fwdPkg.PkgType = PackageType.PKGT_Return;
                        fwdPkg.SendBuffer(conn);
                    }
                }
                    return;
                }
            }

            if (fwd == null)
            {
                fwd = new RPCForwardInfo();
                fwd.ReturnSerialId     = serialId;
                fwd.Gate2ClientConnect = sender;
                fwd.Planes2GateConnect = sender;
            }
            else
            {
                fwd.ReturnSerialId = serialId;
            }

            switch ((PackageType)pkg.PkgType)
            {
            case PackageType.PKGT_Send:
            {        //远端直接执行
                RPCEntrance.Execute(LimitLevel, sender, mRootObject, pkg, fwd);
            }
            break;

            case PackageType.PKGT_SendAndWait:
            {        //远端执行后,返回执行结束
                System.Object retObject = RPCEntrance.Execute(LimitLevel, sender, mRootObject, pkg, fwd);
                if (retObject == null || retObject.GetType() == typeof(void))
                {
                    break;
                }
                var retPkg = new PackageWriter();
                retPkg.SerialId = serialId;
                retPkg.WritePODObject(retObject);
                retPkg.DoReturnCommand(sender, CommandTargetType.DefaultType);
            }
            break;

            case PackageType.PKGT_C2P_Send:
            {
                //pkg.SeekTo(nLength-sizeof(RPCHeader)-RPCForwardInfo.GetBlockSize());
                pkg.SeekTo(nLength - PackageProxy.HeaderSize - RPCForwardInfo.GetBlockSize());
                fwd.Read(pkg);
                pkg.SeekTo(0);
                System.Object retObject = RPCEntrance.Execute(fwd.LimitLevel, fwd.Planes2GateConnect, mRootObject, pkg, fwd);
            }
            break;

            case PackageType.PKGT_C2P_Player_Send:
            {
                if (mPlanesServerSpecialRoot == null)
                {
                    Log.Log.Common.Print("有人改分包了,不是Planes但是收到PKGT_C2P_Player_Send消息");
                    break;
                }

                RPCSpecialHolder holder = new RPCSpecialHolder(pData, nLength - RPCForwardInfo.GetBlockSize());
                holder.mForward = new RPCForwardInfo();

                //pkg.SeekTo(nLength-sizeof(RPCHeader)-RPCForwardInfo.GetBlockSize());
                pkg.SeekTo(nLength - PackageProxy.HeaderSize - RPCForwardInfo.GetBlockSize());
                holder.mForward.Read(pkg);
                pkg.SeekTo(0);
                holder.mForward.ReturnSerialId     = serialId;
                holder.mForward.Planes2GateConnect = sender;

                mPlanesServerSpecialRoot.Push2Processor(holder, (int)PackageType.PKGT_C2P_Player_Send);
            }
            break;

            case PackageType.PKGT_C2P_SendAndWait:
            {
                //pkg.SeekTo(nLength-sizeof(RPCHeader)-RPCForwardInfo.GetBlockSize());
                pkg.SeekTo(nLength - PackageProxy.HeaderSize - RPCForwardInfo.GetBlockSize());
                fwd.Read(pkg);
                pkg.SeekTo(0);
                System.Object retObject = RPCEntrance.Execute(fwd.LimitLevel, fwd.Planes2GateConnect, mRootObject, pkg, fwd);
                if (retObject == null || retObject.GetType() == typeof(void))
                {
                    //Log.Log.Common.Print("有人改分包了,不是Planes但是收到PKGT_C2P_SendAndWait消息");
                    break;
                }
                var retPkg = new PackageWriter();
                retPkg.SerialId = serialId;
                retPkg.WritePODObject(retObject);
                retPkg.Write(fwd.Handle);
                retPkg.DoReturnCommand(sender, CommandTargetType.Planes);
            }
            break;

            case PackageType.PKGT_C2P_Player_SendAndWait:
            {
                if (mPlanesServerSpecialRoot == null)
                {
                    Log.Log.Common.Print("有人改分包了,不是Planes但是收到PKGT_C2P_Player_SendAndWait消息");
                    break;
                }
                var holder = new RPCSpecialHolder(pData, nLength - RPCForwardInfo.GetBlockSize());
                holder.mForward = new RPCForwardInfo();
                holder.mForward.ReturnSerialId = serialId;
                //pkg.SeekTo(nLength-sizeof(RPCHeader)-RPCForwardInfo.GetBlockSize());
                pkg.SeekTo(nLength - PackageProxy.HeaderSize - RPCForwardInfo.GetBlockSize());
                holder.mForward.Read(pkg);
                pkg.SeekTo(0);
                holder.mForward.Planes2GateConnect = sender;

                mPlanesServerSpecialRoot.Push2Processor(holder, (int)PackageType.PKGT_C2P_Player_SendAndWait);
            }
            break;

            case PackageType.PKGT_Return:
            {
                OnFarCallFinished(serialId, pkg, false);
            }
            break;

            case PackageType.PKGT_C2P_Return:
            {
                if (mGateServerForward == null)
                {
                    Log.Log.Common.Print("有人改分包了,不是Gate但是收到PKGT_C2P_Return消息");
                    return;
                }
                System.UInt16 handle;
                //pkg.SeekTo(nLength-sizeof(RPCHeader)-sizeof(System.UInt16));
                pkg.SeekTo(nLength - PackageProxy.HeaderSize - sizeof(System.UInt16));
                pkg.Read(out handle);
                pkg.SeekTo(0);
                Iocp.NetConnection conn = mGateServerForward.GetConnectByHandle(handle);
                if (conn != null)
                {
                    var fwdPkg = new PackageWriter(pData, nLength - sizeof(System.UInt16));
                    fwdPkg.PkgType = PackageType.PKGT_Return;
                    fwdPkg.SendBuffer(conn);
                }
            }
            break;

            case PackageType.PKGT_P2C_Send:
            {
                if (mGateServerForward == null)
                {
                    Log.Log.Common.Print("有人改分包了,不是Gate但是收到PKGT_C2P_Return消息");
                    return;
                }
                System.UInt16 handle;
                //pkg.SeekTo(nLength-sizeof(RPCHeader)-sizeof(System.UInt16));
                pkg.SeekTo(nLength - PackageProxy.HeaderSize - sizeof(System.UInt16));
                pkg.Read(out handle);
                pkg.SeekTo(0);
                Iocp.TcpConnect conn = mGateServerForward.GetConnectByHandle(handle) as Iocp.TcpConnect;
                if (conn != null)
                {
                    if (conn.State != Iocp.NetState.Connect)
                    {
                        if (OnP2CCall_WhenClientDisConnect != null)
                        {
                            OnP2CCall_WhenClientDisConnect(handle, conn);
                        }
                    }
                    else
                    {
                        pkg.PkgType = PackageType.PKGT_Send;
                        //pkg.DangrouseSetPkgLength(nLength - sizeof(System.UInt16));

                        conn.SendBuffer(pkg.Ptr, 0, (int)(nLength - sizeof(System.UInt16)));
                    }
                }
            }
                return;
            }
        }
Exemplo n.º 7
0
        public static System.Object Execute(int limitLevel, Iocp.NetConnection connect, RPCObject rootObj, PackageProxy pkg, RPCForwardInfo fwd)
        {
            if (rootObj == null)
            {
                return(null);
            }
            try
            {
                if (EntranceExecute != null)
                {
                    return(EntranceExecute(limitLevel, connect, rootObj, pkg, fwd));
                }
                else
                {
                    RPCObject curExe = rootObj;
                    for (Int16 i = 0; i < pkg.GetMaxStack(); i++)
                    {
                        if (curExe == null)
                        {
                            return(null);
                        }
                        System.Byte stk = pkg.GetStack(i);
                        if (stk == (Byte)ERPCHeader.StackUnused)
                        {
                            break;
                        }
                        else if (stk < (Byte)ERPCHeader.StackIndexBegin)
                        {
                            //curExe = curExe.RPCGetChildObject(limitLevel,stk);
                            curExe = curExe.GetRPCClassInfo().RPCGetChildObject(limitLevel, stk, curExe);
                            //curExe = (RPCObject)curExe.GetRPCClassInfo().mChildObjects[stk].GetValue(curExe,null);
                        }
                        else
                        {
                            //curExe = curExe.RPCGetIndexObject(limitLevel,stk-RPCHeader.StackIndexBegin,pkg);
                            curExe = curExe.GetRPCClassInfo().RPCGetIndexerExecuter(limitLevel, stk - (Byte)ERPCHeader.StackIndexBegin, curExe, pkg);
                        }
                    }

                    if (curExe == null)
                    {
                        return(null);
                    }
                    //return curExe.GetRPCClassInfo().RPCExecuteMethod(limitLevel,connect,pkg.GetMethod(),pkg,fwd);
                    return(curExe.GetRPCClassInfo().RPCGetMethordExecuter(limitLevel, connect, pkg.GetMethod(), curExe, pkg, fwd));
                }
            }
            catch (System.Exception e)
            {
                System.Diagnostics.Debug.WriteLine(e.Message + "==>");
                System.Diagnostics.Debug.WriteLine(e.StackTrace.ToString());
                Log.Log.Common.Print(e.Message + "==>");
                Log.Log.Common.Print(e.StackTrace.ToString());

                //如果发生RPC函数内部异常,尽量返回一个-128的值,免得服务器之间的调用因为没有返回WaitHandle没有机会清空
                PackageWriter retPkg = new PackageWriter();
                retPkg.Write((System.SByte)(-128));
                retPkg.DoReturnCommand2(connect, fwd.ReturnSerialId);

                return(null);
            }
        }