Ejemplo n.º 1
0
        public bool Open(string strBrokerCfg)
        {
            if (strBrokerCfg.Length > 0)
            {
                m_strListenHost = strBrokerCfg;
            }

            m_acceptor = FFNet.Listen(m_strListenHost, new SocketMsgHandler(HandleMsg), new SocketBrokenHandler(HandleBroken));
            if (m_acceptor != null)
            {
                FFLog.Trace(string.Format("FFBroker open....{0} ok", m_strListenHost));
            }
            else
            {
                FFLog.Trace(string.Format("FFBroker open....{0} failed", m_strListenHost));
            }
            return(true);
        }
Ejemplo n.º 2
0
        public void SaveLog()
        {
            if (m_name2data.Count == 0)
            {
                return;
            }

            try
            {
                string       fileName   = string.Format("./perf_{0:yyyy-MM-dd}.csv", System.DateTime.Now);
                bool         bExistFile = System.IO.File.Exists(fileName);
                FileStream   fs         = new FileStream(fileName, FileMode.Append);
                StreamWriter sw         = new StreamWriter(fs);

                if (!bExistFile)
                {
                    sw.WriteLine("time, mod, max, min, per, rps, times");
                }

                string timefmt = string.Format("{0:yyyy-MM-dd HH:mm:ss}", System.DateTime.Now);
                foreach (var kvp  in m_name2data)
                {
                    string   nameMod = kvp.Key;
                    PerfData data    = kvp.Value;
                    //! -------------------------- time, mod, max, min, per, rps, times
                    Int64 per = data.total / data.times;
                    Int64 rps = 0;
                    if (per > 0)
                    {
                        rps = 1000 * 1000 / per;
                    }
                    string logdata = string.Format("{0},{1},{2},{3},{4},{5},{6}", timefmt, nameMod, data.max, data.min, per, rps, data.times);
                    sw.WriteLine(logdata);
                }
                sw.Flush();
                sw.Close();
                fs.Close();
            }
            catch (System.Exception ex)
            {
                FFLog.Error("PerfMonitor.SaveLog:" + ex.Message);
            }
            m_name2data.Clear();
        }
Ejemplo n.º 3
0
        public static string InitClassByNames(string[] names)
        {
            string nspace = "ff";

            var q = from t in System.Reflection.Assembly.GetExecutingAssembly().GetTypes()
                    where t.IsClass && t.Namespace == nspace
                    select t;

            foreach (string name in names)
            {
                foreach (var t in q.ToList())
                {
                    if (t.Name != name)
                    {
                        continue;
                    }

                    object[] paraNone = new object[] {};
                    System.Reflection.MethodInfo method = t.GetMethod("Instance");
                    if (method != null)
                    {
                        //Console.WriteLine(t.Name + ":" + method);
                        var ret = method.Invoke(null, paraNone);
                        System.Reflection.MethodInfo initMethod = t.GetMethod("Init");
                        if (initMethod != null)
                        {
                            object retB = initMethod.Invoke(ret, paraNone);
                            if (retB != null && retB is bool)
                            {
                                bool b = (bool)retB;
                                FFLog.Trace(string.Format("{0} init {1}", t.Name, b?"ok":"failed"));
                                if (!b)
                                {
                                    return(t.Name);
                                }
                            }
                        }
                    }
                    break;
                }
            }
            return("");
        }
Ejemplo n.º 4
0
        public void HandleAccepted(IAsyncResult ar)
        {
            try
            {
                Socket socket = (Socket)ar.AsyncState;

                //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx
                if (socket != null)
                {
                    var       client   = socket.EndAccept(ar);
                    IFFSocket ffsocket = new FFScoketAsync(m_funcRecv, m_funcBroken, client);
                    ffsocket.AsyncRecv();
                    m_oSocket.BeginAccept(new AsyncCallback(HandleAccepted), m_oSocket);
                }
            }
            catch (Exception ex)
            {
                FFLog.Trace("scoket: handleAccepted Error " + ex.Message);
            }
        }
Ejemplo n.º 5
0
        public bool Call <MSG_TYPE>(string strServiceName, MSG_TYPE msgData)
            where MSG_TYPE : Thrift.Protocol.TBase, new()
        {
            if (!m_brokerData.Service2node_id.ContainsKey(strServiceName))
            {
                FFLog.Trace(string.Format("ffrpc.Call servervice:{0} not exist", strServiceName));
                return(false);
            }
            BrokerRouteMsgReq reqMsg = new BrokerRouteMsgReq()
            {
                Callback_id = 0, Err_info = ""
            };

            reqMsg.Dest_node_id      = m_brokerData.Service2node_id[strServiceName];
            reqMsg.Dest_service_name = strServiceName;
            reqMsg.Body          = Util.Byte2String(FFNet.EncodeMsg(msgData));
            reqMsg.Dest_msg_name = Type2Name(msgData);
            SendToDestNode(reqMsg);
            return(true);
        }
Ejemplo n.º 6
0
 public bool Listen(string ip, int port)
 {
     try{
         if (ip == "*" || ip == "")
         {
             m_oSocket.Bind(new System.Net.IPEndPoint(System.Net.IPAddress.Any, port));
         }
         else
         {
             m_oSocket.Bind(new System.Net.IPEndPoint(System.Net.IPAddress.Parse(ip), port));
         }
         m_oSocket.Listen(2);
         m_oSocket.BeginAccept(new AsyncCallback(HandleAccepted), m_oSocket);
     }
     catch (Exception ex)
     {
         FFLog.Trace("scoket: listen Error " + ex.Message);
         return(false);
     }
     return(true);
 }
Ejemplo n.º 7
0
        public bool Open(string strBrokerHost, string strGateListenIpPort, int nGateIndex)
        {
            m_nGateIndex  = nGateIndex;
            m_strGateName = string.Format("gate#{0}", m_nGateIndex);
            m_ffrpc       = new FFRpc(m_strGateName);

            m_ffrpc.Reg <GateChangeLogicNodeReq, EmptyMsgRet>(this.ChangeSessionLogic);
            m_ffrpc.Reg <GateCloseSessionReq, EmptyMsgRet>(this.CloseSession);
            m_ffrpc.Reg <GateRouteMsgToSessionReq, EmptyMsgRet>(this.RouteMsgToSession);
            m_ffrpc.Reg <GateBroadcastMsgToSessionReq, EmptyMsgRet>(this.BroadcastMsgToSession);

            m_acceptor = FFNet.Listen(strGateListenIpPort, new SocketMsgHandler(HandleMsg), new SocketBrokenHandler(HandleBroken));
            if (m_acceptor != null)
            {
                FFLog.Trace(string.Format("FFGate open....{0} ok", strGateListenIpPort));
            }
            else
            {
                FFLog.Trace(string.Format("FFGate open....{0} failed", strGateListenIpPort));
            }
            return(true);
        }
Ejemplo n.º 8
0
        private void handleSendEnd(IAsyncResult ar)
        {
            var socket = ar.AsyncState as Socket;

            try
            {
                if (socket == null || m_oSocket == null || !socket.Connected)
                {
                    return;
                }
                socket.EndSend(ar);
            }
            catch (Exception ex)
            {
                FFLog.Warning("scoket: send Error1 " + ex.Message);
                HandleClose();
                return;
            }
            FFNet.GetTaskQueue().Post(() =>
            {
                try
                {
                    if (m_oBuffSending.Count > 0)
                    {
                        m_oBuffSending.RemoveAt(0);
                    }
                    if (m_oBuffSending.Count > 0 && m_oSocket != null)
                    {
                        byte[] data = m_oBuffSending[0];
                        m_oSocket.BeginSend(data, 0, data.Length, 0, new AsyncCallback(handleSendEnd), m_oSocket);
                    }
                }
                catch (Exception ex)
                {
                    FFLog.Trace("scoket: send Error " + ex.Message);
                    HandleClose();
                }
            });
        }
Ejemplo n.º 9
0
        public EmptyMsgRet OnRouteLogicMsgReq(RouteLogicMsgReq reqMsg)
        {
            Int64 nBeginUs = DateTime.Now.Ticks / 10;
            int   cmd      = reqMsg.Cmd;

            if ((cmd & 0x4000) != 0)
            {
                cmd &= ~(0x4000);
            }
            Int64 nSessionID = reqMsg.SessionId;

            if (m_dictCmd2Func.ContainsKey(cmd) == false)
            {
                FFLog.Error(string.Format("worker cmd invalid! {0}", cmd));
                return(RPC_NONE);
            }
            CmdRegInfo cmdRegInfo = m_dictCmd2Func[cmd];

            cmdRegInfo.cmdHandler(nSessionID, reqMsg.Cmd, reqMsg.Body);
            PerfMonitor.Instance().AddPerf(string.Format("cmd={0}", cmdRegInfo.cmdName), DateTime.Now.Ticks / 10 - nBeginUs);
            return(RPC_NONE);
        }
Ejemplo n.º 10
0
        public EmptyMsgRet OnSessionOfflineReq(SessionOfflineReq reqMsg)
        {
            Int64 nSessionID = reqMsg.Session_id;

            FFLog.Trace(string.Format("worker OnSessionOfflineReq! {0}", nSessionID));
            if (m_dictRoles.ContainsKey(nSessionID) == false)
            {
                return(RPC_NONE);
            }

            Player player = getPlayerBySessionID(nSessionID);

            m_dictRoles.Remove(nSessionID);

            Pbmsg.LogoutRet retMsg = new Pbmsg.LogoutRet()
            {
                Id   = player.getID(),
                Name = player.strName,
            };
            BroadcastPlayerMsg <Pbmsg.LogoutRet>(Pbmsg.ServerCmdDef.SLogout, retMsg);
            return(RPC_NONE);
        }
Ejemplo n.º 11
0
        private void RunAllTask()
        {
            List <FFTask> taskToRun = new List <FFTask>();

            while (m_running)
            {
                m_mutex.WaitOne();
                while (m_running && m_taskList.Count == 0)
                {
                    m_mutex.ReleaseMutex();
                    m_event.WaitOne(100);
                    m_mutex.WaitOne();
                }
                foreach (FFTask task in m_taskList)
                {
                    taskToRun.Add(task);
                }
                m_taskList.Clear();
                m_mutex.ReleaseMutex();
                foreach (FFTask task in taskToRun)
                {
                    try
                    {
                        task();
                    }
                    catch (System.Exception ex)
                    {
                        FFLog.Trace("void RunAllTask exception:" + ex.Message);
                        continue;
                    }
                    finally
                    {
                    }
                }
                taskToRun.Clear();
            }
        }
Ejemplo n.º 12
0
        public static void SendMsg(IFFSocket ffsocket, UInt16 cmdSrc, byte[] strData)
        {
            if (ffsocket.GetProtocolType() == "websocket")
            {
                byte[] cmddata = Util.String2Byte(string.Format("cmd:{0}\n", cmdSrc));
                byte[] wsData  = Util.MergeArray(cmddata, strData);
                ffsocket.AsyncSend(wsData);
                return;
            }
            int len = strData.Length;

            len = System.Net.IPAddress.HostToNetworkOrder(len);
            UInt16 cmd = (UInt16)System.Net.IPAddress.HostToNetworkOrder((Int16)cmdSrc);

            byte[] lenArray = BitConverter.GetBytes(len);
            byte[] cmdArray = BitConverter.GetBytes(cmd);
            byte[] resArray = new byte[2] {
                0, 0
            };
            byte[][] p        = { lenArray, cmdArray, resArray, strData };
            byte[]   sendData = Util.MergeArray(p);
            ffsocket.AsyncSend(sendData);
            FFLog.Trace(string.Format("SendMsg cmd:{0},len:{1},len2:{2}", cmdSrc, strData.Length, sendData.Length));
        }
Ejemplo n.º 13
0
        //!切换worker
        public EmptyMsgRet ChangeSessionLogic(GateChangeLogicNodeReq reqMsg)
        {
            FFLog.Trace(string.Format("FFGate ChangeSessionLogic....sessionid={0}", reqMsg.SessionId));
            if (m_dictClients.ContainsKey(reqMsg.SessionId) == false)
            {
                return(m_msgEmpty);
            }
            ClientInfo            cinfo    = m_dictClients[reqMsg.SessionId];
            SessionEnterWorkerReq msgEnter = new SessionEnterWorkerReq()
            {
            };

            msgEnter.FromWorker  = cinfo.strAllocWorker;
            cinfo.strAllocWorker = reqMsg.AllocWorker;

            msgEnter.SessionId = reqMsg.SessionId;
            msgEnter.FromGate  = m_strGateName;
            msgEnter.SessionIp = cinfo.sockObj.GetIP();

            msgEnter.ToWorker  = reqMsg.AllocWorker;
            msgEnter.ExtraData = reqMsg.ExtraData;
            m_ffrpc.Call(reqMsg.AllocWorker, msgEnter);
            return(m_msgEmpty);
        }
Ejemplo n.º 14
0
        public void HandleRecv(IFFSocket ffsocket, byte[] strData)
        {
            if (m_oWSProtocol.HandleRecv(strData))
            {
                if (ffsocket.GetProtocolType().Length == 0)
                {
                    ffsocket.SetProtocolType("websocket");
                }
                foreach (var eachWaitSend in m_oWSProtocol.GetSendPkg())
                {
                    ffsocket.AsyncSend(eachWaitSend, false);
                }
                m_oWSProtocol.ClearSendPkg();

                foreach (var eachRecvPkg in m_oWSProtocol.GetRecvPkg())
                {
                    if (eachRecvPkg.Length == 0)
                    {
                        continue;
                    }

                    UInt16 nCmd     = 0;
                    byte[] dataBody = eachRecvPkg;


                    int nHeadEndIndex = -1;
                    if (eachRecvPkg[0] == 'c' || eachRecvPkg[0] == 'C')
                    {
                        ffsocket.SetProtocolType("websocket-text");
                        for (int i = 0; i < eachRecvPkg.Length; ++i)
                        {
                            if (eachRecvPkg[i] == '\n')
                            {
                                nHeadEndIndex = i;
                                break;
                            }
                        }
                    }
                    if (nHeadEndIndex > 0)
                    {
                        byte[] bytesHead = new byte[nHeadEndIndex];
                        dataBody = new byte[eachRecvPkg.Length - nHeadEndIndex - 1];
                        Array.Copy(eachRecvPkg, 0, bytesHead, 0, bytesHead.Length);
                        Array.Copy(eachRecvPkg, nHeadEndIndex + 1, dataBody, 0, dataBody.Length);

                        string[] strHeads = Util.Byte2String(bytesHead).Split(",");
                        string[] strCmds  = strHeads[0].Split(":");
                        if (strCmds.Length == 2 && strCmds[1].Length > 0)
                        {
                            nCmd = Convert.ToUInt16(strCmds[1]);
                        }
                    }
                    else
                    {
                        if (eachRecvPkg.Length < 8)
                        {
                            continue;
                        }
                        size     = System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt32(eachRecvPkg, 0));
                        nCmd     = (UInt16)System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt16(eachRecvPkg, 4));
                        flag     = System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt16(eachRecvPkg, 6));
                        dataBody = new byte[eachRecvPkg.Length - 8];
                        Array.Copy(eachRecvPkg, 8, dataBody, 0, dataBody.Length);
                    }
                    //FFLog.Trace(string.Format("cmd={0},data={1}", nCmd, dataBody.Length));

                    try
                    {
                        m_funcMsgHandler(ffsocket, nCmd, dataBody);
                    }
                    catch (Exception ex)
                    {
                        FFLog.Error("wsscoket.HandleRecv error:" + ex.Message);
                    }
                }
                m_oWSProtocol.ClearRecvPkg();
                if (m_oWSProtocol.IsClose())
                {
                    ffsocket.Close();
                }
                return;
            }

            Array.Copy(strData, 0, m_strRecvData, nLeftSize, strData.Length);
            nLeftSize += strData.Length;
            //Util.MergeArray(m_strRecvData, strData);
            int nRead = 0;

            while (true)
            {
                if (nLeftSize < nRead + 8)
                {
                    Array.Copy(m_strRecvData, nRead, m_strRecvData, 0, nLeftSize - nRead);
                    break;
                }
                size = System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt32(m_strRecvData, nRead + 0));
                cmd  = (UInt16)System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt16(m_strRecvData, nRead + 4));
                flag = System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt16(m_strRecvData, nRead + 6));
                //FFLog.Trace(string.Format("HandleRecv cmd:{0},len:{1},recvlen:{2}", cmd, size, m_strRecvData.Length));

                if (cmd == 0 || size == 0)
                {
                    string st = "";
                    foreach (byte b in m_strRecvData)
                    {
                        st += b.ToString();
                    }
                    FFLog.Trace(st);

                    m_strRecvData = new byte[0];
                    string st2 = "";
                    foreach (byte b in strData)
                    {
                        st2 += b.ToString();
                    }
                    FFLog.Trace(st2);
                    break;
                }
                if (nLeftSize < nRead + 8 + size)
                {
                    //FFLog.Error("scoket.HandleRecv 111111111111111111");
                    Array.Copy(m_strRecvData, nRead, m_strRecvData, 0, nLeftSize - nRead);
                    break;
                }
                byte[] msgBody = new byte[size];
                Array.Copy(m_strRecvData, nRead + 8, msgBody, 0, size);
                nRead += (8 + size);
                // if (strData.Length == 8 + size)
                // {
                // m_strRecvData = new byte[0];
                // }
                // else{
                // FFLog.Trace(string.Format("HandleRecv cmd:{0},len:{1},recvlen:{2},leftData:{3}", cmd, size, m_strRecvData.Length, leftData.Length));
                // }
                try
                {
                    m_funcMsgHandler(ffsocket, cmd, msgBody);
                }
                catch (Exception ex)
                {
                    FFLog.Error("scoket.HandleRecv error:" + ex.Message);
                }
            }
            nLeftSize -= nRead;
        }
Ejemplo n.º 15
0
        public static void Main(string[] args)
        {
#if linux
            //if (args.Length >= 1 && (args[0] == "/daemon" || args[0] == "--daemon"))
            for (int i = 0; i < args.Length; ++i)
            {
                if (args[i] != "/daemon" && args[i] != "--daemon")
                {
                    continue;
                }
                FFLog.Trace(string.Format("config {0}", args[i]));

                int pid = fork();
                if (pid != 0)
                {
                    exit(0);
                }
                setsid();
                pid = fork();
                if (pid != 0)
                {
                    exit(0);
                }
                umask(022);

                int max = open("/dev/null", 0);
                for (var m = 0; m <= max; m++)
                {
                    close(m);
                }

                //!read write error
                int fd = open("/dev/null", 0);
                dup(fd);
                dup(fd);

                var executablePath = Environment.GetCommandLineArgs()[0];
                FFLog.Trace(string.Format("executablePath {0}", executablePath));
                string[] argsNew     = new string[args.Length + 1];//{"mono", executablePath};
                int      assignIndex = 0;
                argsNew[assignIndex] = "mono";
                assignIndex         += 1;
                argsNew[assignIndex] = executablePath;
                assignIndex         += 1;
                for (int j = 0; j < args.Length; ++j)
                {
                    if (i == j)
                    {
                        continue;
                    }
                    argsNew[assignIndex] = args[j];
                    assignIndex         += 1;
                }
                execvp("mono", argsNew);
                return;
            }
#endif

            string   host     = "tcp://127.0.0.1:43210";
            FFBroker ffbroker = new FFBroker();
            ffbroker.Open(host);

            int      nWorkerIndex = 0;
            FFWorker worker       = new FFWorker();
            if (worker.Open(host, nWorkerIndex) == false)
            {
                FFLog.Trace("ffrpc open failed!");
            }

            //Console.ReadKey();
            //ffrpc.GetTaskQueue().Post(() =>
            //{
            //    SessionEnterWorkerReq reqMsg = new SessionEnterWorkerReq() { From_gate = "gate#0" };
            //    WorkerCallMsgReq reqWorkerCall = new WorkerCallMsgReq();
            //    //ffrpc.Call(strServiceName, reqMsg);
            //    reqMsg.From_gate = "gate#1";
            //    ffrpc.Call(strServiceName, reqWorkerCall, (SessionEnterWorkerReq retMsg) =>
            //    {
            //        FFLog.Trace(string.Format("ffrpc SessionEnterWorkerReq return!!!FromGate={0}", retMsg.From_gate));
            //    });
            //});
            FFGate ffGate = new FFGate();
            if (ffGate.Open(host, "tcp://*:44000", 0) == false)
            {
                FFLog.Trace("ffGate open failed!");
            }


            //FFNet.Timerout(1000, Theout);
            //FFNet.Timerout(2000, Theout);
            // FFNet.Timerout(1000000, () =>
            // {
            // FFLog.Debug("AAAAAAAAAAAAAAA1");
            // //ffbroker.Close();
            // });
            //FFLog.Trace(string.Format("main! {0}", System.Threading.Thread.CurrentThread.ManagedThreadId.ToString()));

            bool bExit = false;
            AppDomain.CurrentDomain.ProcessExit += (sender, arg) =>
            {
                FFLog.Trace("exist!!");
                bExit = true;
            };
            Console.CancelKeyPress += (object sender, ConsoleCancelEventArgs e) => {
                e.Cancel = true;
                FFLog.Trace("exist3!!");

                FFNet.Cleanup();
                FFLog.Cleanup();
                bExit = true;
            };
            while (!bExit)
            {
                System.Threading.Thread.Sleep(300);
            }

            FFLog.Trace("exist!!");
            FFNet.Cleanup();
            FFLog.Cleanup();
        }
Ejemplo n.º 16
0
        public static void Main(string[] args)
        {
            string   host     = "tcp://127.0.0.1:43210";
            FFBroker ffbroker = new FFBroker();

            ffbroker.Open(host);

            int      nWorkerIndex = 0;
            FFWorker worker       = new FFWorker();

            if (worker.Open(host, nWorkerIndex) == false)
            {
                FFLog.Trace("ffrpc open failed!");
            }

            //Console.ReadKey();
            //ffrpc.GetTaskQueue().Post(() =>
            //{
            //    SessionEnterWorkerReq reqMsg = new SessionEnterWorkerReq() { From_gate = "gate#0" };
            //    WorkerCallMsgReq reqWorkerCall = new WorkerCallMsgReq();
            //    //ffrpc.Call(strServiceName, reqMsg);
            //    reqMsg.From_gate = "gate#1";
            //    ffrpc.Call(strServiceName, reqWorkerCall, (SessionEnterWorkerReq retMsg) =>
            //    {
            //        FFLog.Trace(string.Format("ffrpc SessionEnterWorkerReq return£¡£¡£¡FromGate={0}", retMsg.From_gate));
            //    });
            //});
            FFGate ffGate = new FFGate();

            if (ffGate.Open(host, "tcp://*:44000", 0) == false)
            {
                FFLog.Trace("ffGate open failed!");
            }


            //FFNet.Timerout(1000, Theout);
            //FFNet.Timerout(2000, Theout);
            FFNet.Timerout(100000, () =>
            {
                FFLog.Debug("AAAAAAAAAAAAAAA1");
                //ffbroker.Close();
            });
            FFLog.Trace(string.Format("main! {0}", System.Threading.Thread.CurrentThread.ManagedThreadId.ToString()));

            AppDomain.CurrentDomain.ProcessExit += (sender, arg) =>
            {
                FFLog.Trace("exist!!");
            };
            Console.CancelKeyPress += (object sender, ConsoleCancelEventArgs e) => {
                e.Cancel = true;
                FFLog.Trace("exist3!!");

                FFNet.Cleanup();
                FFLog.Cleanup();
            };
            Console.ReadKey();

            FFLog.Trace("exist!!");
            FFNet.Cleanup();
            FFLog.Cleanup();
        }
Ejemplo n.º 17
0
        public bool HandleRecv(byte[] strNewData)
        {
            if (statusWebSocketConnection == -1)
            {
                return(false);
            }
            cacheRecvData = MergeArray(cacheRecvData, strNewData);
            if (dictParams.Count == 0)
            {
                string strRecvData = Byte2String(cacheRecvData);
                if (strRecvData.Length < 3)
                {
                    return(true);
                }
                if (strRecvData.Length >= 3 && strRecvData.StartsWith("GET") == false)
                {
                    statusWebSocketConnection = -1;
                    return(false);
                }
                if (strRecvData.Contains("\r\n\r\n") == false)//!header data not end
                {
                    return(true);
                }
                if (strRecvData.Contains("Upgrade: websocket") == false)
                {
                    statusWebSocketConnection = -1;
                    return(false);
                }
                string[] strLines = strRecvData.Split("\r\n");
                foreach (var line in strLines)
                {
                    string[] strParams = line.Split(": ");
                    if (strParams.Length == 2)
                    {
                        dictParams[strParams[0]] = strParams[1];
                    }
                    else if (strParams.Length == 1 && strParams[0].Contains("GET"))
                    {
                        dictParams["PATH"] = strParams[0];
                    }
                }
                if (true == dictParams.ContainsKey("Sec-WebSocket-Key"))
                {
                    string Sec_WebSocket_Key = dictParams["Sec-WebSocket-Key"];
                    string strGUID           = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
                    byte[] dataToHash        = System.Text.Encoding.UTF8.GetBytes(Sec_WebSocket_Key + strGUID);
                    byte[] dataHashed        = SHA1.Create().ComputeHash(dataToHash);
                    string strHashBase64     = Convert.ToBase64String(dataHashed);

                    string strSendData = string.Format("HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: {0}\r\n\r\n", strHashBase64);
                    AddSendPkg(String2Byte(strSendData));
                    strRecvData               = "";
                    cacheRecvData             = new byte[0];
                    statusWebSocketConnection = 1;

                    return(true);
                }
                else if (true == dictParams.ContainsKey("Sec-WebSocket-Key1"))
                {
                    string handshake = "HTTP/1.1 101 Web Socket Protocol Handshake\r\nUpgrade: WebSocket\r\nConnection: Upgrade\r\n";

                    string str_origin = dictParams["Origin"];
                    if (str_origin.Length == 0)
                    {
                        str_origin = "null";
                    }
                    handshake += "Sec-WebSocket-Origin: " + str_origin + "\r\n";

                    string str_host = dictParams["Host"];
                    if (str_host.Length > 0)
                    {
                        string[] tmp_path_arg = strLines[0].Split(" ");
                        string   tmp_path     = "/";
                        if (tmp_path_arg.Length >= 2)
                        {
                            tmp_path = tmp_path_arg[1];
                        }

                        handshake += "Sec-WebSocket-Location: ws://" + dictParams["Host"] + tmp_path + "\r\n\r\n";
                    }

                    UInt32 key1 = ComputeWebsokcetKeyVal(dictParams["Sec-WebSocket-Key1"]);
                    UInt32 key2 = ComputeWebsokcetKeyVal(dictParams["Sec-WebSocket-Key2"]);

                    string keyExt = strLines[strLines.Length - 1];
                    if (keyExt.Length < 8)
                    {
                        statusWebSocketConnection = -1;
                        return(false);
                    }

                    byte[] tmpBuff     = new byte[16];
                    byte[] key1Bytes   = BitConverter.GetBytes(key1);
                    byte[] key2Bytes   = BitConverter.GetBytes(key2);
                    byte[] keyExtBytes = String2Byte(keyExt);
                    Array.Copy(key1Bytes, 0, tmpBuff, 0, key1Bytes.Length);
                    Array.Copy(key2Bytes, 0, tmpBuff, key1Bytes.Length, key2Bytes.Length);
                    Array.Copy(keyExtBytes, 0, tmpBuff, key1Bytes.Length + key2Bytes.Length, keyExtBytes.Length);
                    handshake += ComputeMd5(tmpBuff);
                    AddSendPkg(String2Byte(handshake));
                }
                else
                {
                    statusWebSocketConnection = -1;
                    return(false);
                }
            }
            int nFIN    = ((cacheRecvData[0] & 0x80) == 0x80)? 1: 0;
            int nOpcode = cacheRecvData[0] & 0x0F;
            //int nMask = ((cacheRecvData[1] & 0x80) == 0x80) ? 1 : 0;
            int nPayload_length     = cacheRecvData[1] & 0x7F;
            int nPlayLoadLenByteNum = 1;
            int nMaskingKeyByteNum  = 4;

            if (nPayload_length == 126)
            {
                nPlayLoadLenByteNum = 3;
            }
            else if (nPayload_length == 127)
            {
                nPlayLoadLenByteNum = 9;
            }
            if (cacheRecvData.Length < (1 + nPlayLoadLenByteNum + nMaskingKeyByteNum))
            {
                return(true);
            }
            if (nPayload_length == 126)
            {
                byte[] nPayload_length_Bytes = new byte[2];
                Array.Copy(cacheRecvData, 2, nPayload_length_Bytes, 0, nPayload_length_Bytes.Length);
                nPayload_length = System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt16(nPayload_length_Bytes, 0));
            }
            else if (nPayload_length == 127)
            {
                byte[] nPayload_length_Bytes = new byte[8];
                Array.Copy(cacheRecvData, 2, nPayload_length_Bytes, 0, nPayload_length_Bytes.Length);
                nPayload_length = (int)System.Net.IPAddress.NetworkToHostOrder((long)BitConverter.ToInt64(nPayload_length_Bytes, 0));
            }
            if (cacheRecvData.Length < (1 + nPlayLoadLenByteNum + nMaskingKeyByteNum + nPayload_length))
            {
                return(true);
            }

            byte[] aMasking_key = new byte[nMaskingKeyByteNum];
            Array.Copy(cacheRecvData, 1 + nPlayLoadLenByteNum, aMasking_key, 0, nMaskingKeyByteNum);
            byte[] aPayload_data = new byte[nPayload_length];
            Array.Copy(cacheRecvData, 1 + nPlayLoadLenByteNum + nMaskingKeyByteNum, aPayload_data, 0, nPayload_length);
            int nLeftSize = cacheRecvData.Length - (1 + nPlayLoadLenByteNum + nMaskingKeyByteNum + nPayload_length);

            byte[] leftBytes = new byte[nLeftSize];
            if (nLeftSize > 0)
            {
                Array.Copy(cacheRecvData, 1 + nPlayLoadLenByteNum + nMaskingKeyByteNum + nPayload_length, leftBytes, 0, nLeftSize);
            }
            cacheRecvData = leftBytes;
            for (int i = 0; i < nPayload_length; i++)
            {
                aPayload_data[i] = (byte)(aPayload_data[i] ^ aMasking_key[i % 4]);
            }
            FFLog.Trace(string.Format("nOpcode={0},data={1}", nOpcode, aPayload_data.Length));
            if (8 == nOpcode)
            {
                AddSendPkg(BuildPkg(new byte[0], nOpcode));// close
                bIsClose = true;
            }
            else if (2 == nOpcode || 1 == nOpcode || 0 == nOpcode || 9 == nOpcode)
            {
                if (9 == nOpcode)                           //!ping
                {
                    AddSendPkg(BuildPkg(new byte[0], 0xA)); // pong
                }

                if (nFIN == 1)
                {
                    if (dataFragmentation.Length == 0)
                    {
                        AddRecvPkg(aPayload_data);
                    }
                    else
                    {
                        dataFragmentation = MergeArray(dataFragmentation, aPayload_data);
                        AddRecvPkg(dataFragmentation);
                        dataFragmentation = new byte[0];
                    }
                }
                else
                {
                    dataFragmentation = MergeArray(dataFragmentation, aPayload_data);
                }
            }

            return(true);
        }
Ejemplo n.º 18
0
        public EmptyMsgRet OnRouteLogicMsgReq(RouteLogicMsgReq reqMsg)
        {
            int   cmd        = reqMsg.Cmd;
            Int64 nSessionID = reqMsg.SessionId;
            //FFLog.Trace(string.Format("worker RouteLogicMsgReq! {0} {1}", cmd, nSessionID));
            bool bIsYuanShenMsg = false;

            if ((cmd & 0x4000) != 0)
            {
                cmd           &= ~(0x4000);
                bIsYuanShenMsg = true;
            }
            if (m_dictCmd2Func.ContainsKey(cmd) == false)
            {
                FFLog.Error(string.Format("worker cmd invalid! {0}", cmd));
                return(RPC_NONE);
            }
            if (cmd == (int)Pbmsg.ClientCmdDef.CLogin)
            {
                Player playerOld = GetPlayerBySessionID(nSessionID);
                if (playerOld != null)
                {
                    ClosePlayer(playerOld);
                    if (playerOld.nSessionID == nSessionID)
                    {
                        m_dictRoles.Remove(nSessionID);
                        FFLog.Error(string.Format("worker cmd invalid! {0} {1} login twice", cmd, nSessionID));
                        return(RPC_NONE);
                    }
                }
                else
                {
                    Player playerNew = new Player()
                    {
                        nSessionID = nSessionID
                    };
                    m_dictRoles[nSessionID] = playerNew;
                }
            }
            else
            {
                if (m_dictRoles.ContainsKey(nSessionID) == false)
                {
                    FFLog.Error(string.Format("worker cmd invalid! {0}, have not recv login msg", cmd));
                    return(RPC_NONE);
                }
            }
            Player player = GetPlayerBySessionID(nSessionID);

            if (bIsYuanShenMsg)
            {
                if (null == player.playerYS)
                {
                    FFLog.Error(string.Format("playerYS invalid", cmd));
                    return(RPC_NONE);
                }
                m_dictCmd2Func[cmd](player.playerYS, reqMsg.Body);
            }
            else
            {
                m_dictCmd2Func[cmd](player, reqMsg.Body);
            }

            return(RPC_NONE);
        }
Ejemplo n.º 19
0
        public void HandleLogin(Int64 nSessionID, Pbmsg.LoginReq reqMsg)
        {
            Player playerOld = RoleMgr.Instance().GetPlayerBySessionID(nSessionID);

            if (playerOld != null)
            {
                if (playerOld.nSessionID == nSessionID)
                {
                    FFLog.Error(string.Format("worker cmd invalid! {0} login twice", nSessionID));
                }
                return;
            }

            Player player = new Player()
            {
                nSessionID = nSessionID
            };

            RoleMgr.Instance().AddRole(player);

            player.strName = reqMsg.Name;
            player.nLevel  = 1;

            Pbmsg.LoginRet retMsg = new Pbmsg.LoginRet()
            {
                Id    = player.GetID(),
                Name  = reqMsg.Name,
                Level = player.nLevel,
            };

            player.SendPlayerMsg(Pbmsg.ServerCmdDef.SLogin, retMsg);

            {
                Pbmsg.EnterMapRet enterMapRet = player.BuildEnterMsg();
                FFWorker.Instance().GateBroadcastMsg((int)Pbmsg.ServerCmdDef.SEnterMap, enterMapRet);

                player.playerYS = new Player()
                {
                    nSessionID = player.nSessionID + 100000, strName = player.strName + "的元神", idZhuTi = player.GetID()
                };
                player.playerYS.x      = player.x - 1;
                player.playerYS.y      = player.y - 1;
                player.playerYS.apprID = player.apprID;
                RoleMgr.Instance().AddRole(player.playerYS);

                enterMapRet = player.playerYS.BuildEnterMsg();
                FFWorker.Instance().GateBroadcastMsg((int)Pbmsg.ServerCmdDef.SEnterMap, enterMapRet);
            }

            RoleMgr.Instance().ForeachRole((Role roleOther) => {
                if (roleOther.GetID() == player.GetID())
                {
                    return;
                }
                if (roleOther.hp == 0)
                {
                    return;
                }
                Pbmsg.EnterMapRet enterMapRet = roleOther.BuildEnterMsg();
                player.SendPlayerMsg(Pbmsg.ServerCmdDef.SEnterMap, enterMapRet);
            });
        }
Ejemplo n.º 20
0
 public static void Cleanup()
 {
     FFLog.GetInstance().DoCleanup();
 }
Ejemplo n.º 21
0
 public static void Error(string data)
 {
     FFLog.GetInstance().LogToFile(FFLogLevel.ERROR, data);
 }
Ejemplo n.º 22
0
 public static void Warning(string data)
 {
     FFLog.GetInstance().LogToFile(FFLogLevel.WARNING, data);
 }
Ejemplo n.º 23
0
 public static void Info(string data)
 {
     FFLog.GetInstance().LogToFile(FFLogLevel.INFO, data);
 }
Ejemplo n.º 24
0
 public static void Trace(string data)
 {
     FFLog.GetInstance().LogToFile(FFLogLevel.TRACE, data);
 }
Ejemplo n.º 25
0
 public static void Debug(string data)
 {
     FFLog.GetInstance().LogToFile(FFLogLevel.DEBUG, data);
 }
Ejemplo n.º 26
0
        public void HandleRecv(IFFSocket ffsocket, byte[] strData)
        {
            if (m_oWSProtocol.HandleRecv(strData))
            {
                if (ffsocket.GetProtocolType().Length == 0)
                {
                    ffsocket.SetProtocolType("websocket");
                }
                foreach (var eachWaitSend in m_oWSProtocol.GetSendPkg())
                {
                    ffsocket.AsyncSend(eachWaitSend, false);
                }
                m_oWSProtocol.ClearSendPkg();

                foreach (var eachRecvPkg in m_oWSProtocol.GetRecvPkg())
                {
                    int nHeadEndIndex = -1;
                    for (int i = 0; i < eachRecvPkg.Length; ++i)
                    {
                        if (eachRecvPkg[i] == '\n')
                        {
                            nHeadEndIndex = i;
                            break;
                        }
                    }
                    UInt16 nCmd     = 0;
                    byte[] dataBody = eachRecvPkg;
                    if (nHeadEndIndex > 0)
                    {
                        byte[] bytesHead = new byte[nHeadEndIndex];
                        dataBody = new byte[eachRecvPkg.Length - nHeadEndIndex - 1];
                        Array.Copy(eachRecvPkg, 0, bytesHead, 0, bytesHead.Length);
                        Array.Copy(eachRecvPkg, nHeadEndIndex + 1, dataBody, 0, dataBody.Length);

                        string[] strHeads = Util.Byte2String(bytesHead).Split(",");
                        string[] strCmds  = strHeads[0].Split(":");
                        if (strCmds.Length == 2 && strCmds[1].Length > 0)
                        {
                            nCmd = Convert.ToUInt16(strCmds[1]);
                        }
                    }
                    FFLog.Trace(string.Format("cmd={0},data={1}", nCmd, Util.Byte2String(dataBody)));

                    try
                    {
                        m_funcMsgHandler(ffsocket, nCmd, dataBody);
                    }
                    catch (Exception ex)
                    {
                        FFLog.Error("wsscoket.HandleRecv error:" + ex.Message);
                    }
                }
                m_oWSProtocol.ClearRecvPkg();
                if (m_oWSProtocol.IsClose())
                {
                    ffsocket.Close();
                }
                return;
            }

            m_strRecvData = Util.MergeArray(m_strRecvData, strData);
            while (m_strRecvData.Length >= 8)
            {
                size = System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt32(m_strRecvData, 0));
                cmd  = (UInt16)System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt16(m_strRecvData, 4));
                flag = System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt16(m_strRecvData, 6));
                FFLog.Trace(string.Format("HandleRecv cmd:{0},len:{1}", cmd, size));
                if (m_strRecvData.Length < 8 + size)
                {
                    break;
                }
                byte[] msgBody = new byte[size];
                Array.Copy(m_strRecvData, 8, msgBody, 0, size);
                if (m_strRecvData.Length == 8 + size)
                {
                    m_strRecvData = new byte[0];
                }
                else
                {
                    byte[] leftData = new byte[m_strRecvData.Length - (8 + size)];
                    Array.Copy(m_strRecvData, 8 + size, leftData, 0, size);
                    m_strRecvData = leftData;
                }
                try
                {
                    m_funcMsgHandler(ffsocket, cmd, msgBody);
                }
                catch (Exception ex)
                {
                    FFLog.Error("scoket.HandleRecv error:" + ex.Message);
                }
            }
        }
Ejemplo n.º 27
0
        public void HandleMsg(IFFSocket ffsocket, UInt16 cmd, string strMsg)
        {
            //FFLog.Trace(string.Format("ffrpc.FFRpc handleMsg....{0}, {1} [{2}]", cmd, strMsg.Length, System.Threading.Thread.CurrentThread.ManagedThreadId.ToString()));
            try
            {
                switch ((FFRPC_CMD)cmd)
                {
                case FFRPC_CMD.REGISTER_TO_BROKER_RET:
                {
                    FFNet.DecodeMsg(m_brokerData, strMsg);
                    FFLog.Trace(string.Format("ffrpc.handleMsg..REGISTER_TO_BROKER_RET..{0}, {1}", m_brokerData.Node_id, m_brokerData.Register_flag));
                    if (m_brokerData.Register_flag == 1)
                    {
                        m_nNodeID = m_brokerData.Node_id;        //! -1表示注册失败,0表示同步消息,1表示注册成功
                    }
                } break;

                case FFRPC_CMD.BROKER_TO_CLIENT_MSG:
                {
                    BrokerRouteMsgReq reqMsg = new BrokerRouteMsgReq();
                    FFNet.DecodeMsg(reqMsg, strMsg);
                    FFLog.Trace(string.Format("ffrpc.BROKER_TO_CLIENT_MSG msgname={0}", reqMsg.Dest_msg_name));
                    if (reqMsg.Err_info.Length > 0)
                    {
                        FFLog.Error(string.Format("FFRpc::handleRpcCallMsg error={0}", reqMsg.Err_info));
                        if (reqMsg.Callback_id == 0)
                        {
                            return;
                        }
                    }
                    try
                    {
                        if (reqMsg.Dest_service_name.Length > 0)
                        {
                            if (!m_dictFuncs.ContainsKey(reqMsg.Dest_msg_name))
                            {
                                reqMsg.Err_info = "interface named " + reqMsg.Dest_msg_name + " not found in rpc";
                                FFLog.Error(string.Format("FFRpc::handleRpcCallMsg error={0}", reqMsg.Err_info));
                                reqMsg.Dest_node_id      = reqMsg.From_node_id;
                                reqMsg.Dest_service_name = "";
                                SendToDestNode(reqMsg);
                                return;
                            }
                            FFRpcFunc destFunc = m_dictFuncs[reqMsg.Dest_msg_name];
                            destFunc(reqMsg);
                        }
                        else
                        {
                            if (!m_dictCallBack.ContainsKey(reqMsg.Callback_id))
                            {
                                return;
                            }
                            FFRpcFunc destFunc = m_dictCallBack[reqMsg.Callback_id];
                            destFunc(reqMsg);
                        }
                    }
                    catch (Exception ex)
                    {
                        FFLog.Error("ffrpc handleMsg" + ex.Message);
                    }
                }
                break;

                default:
                    break;
                }
            }
            catch (Exception ex)
            {
                FFLog.Error("ffprc.Error:" + ex.Message);
            }
        }