예제 #1
0
        public void HandleBroken(IFFSocket ffsocket)
        {
            Int64  nNodeID        = 0;
            string strServiceName = "";

            foreach (KeyValuePair <Int64, IFFSocket> kvp in m_dictSockets)
            {
                if (kvp.Value == ffsocket)
                {
                    nNodeID = kvp.Key;
                    break;
                }
            }
            if (nNodeID != 0)
            {
                m_dictSockets.Remove(nNodeID);
                foreach (KeyValuePair <string, long> kvp in m_brokerData.Service2node_id)
                {
                    if (kvp.Value == nNodeID)
                    {
                        strServiceName = kvp.Key;
                        break;
                    }
                }
            }
            if (strServiceName.Length > 0)
            {
                m_brokerData.Service2node_id.Remove(strServiceName);
            }
            FFLog.Trace(string.Format("FFBroker HandleBroken....{0}, {1}", nNodeID, strServiceName));
            SyncNodeInfo(m_brokerData, null);
        }
예제 #2
0
        public void HandleMsg(IFFSocket ffsocket, UInt16 cmd, byte[] strMsg)
        {
            var sessionData = ffsocket.GetSessionData();

            if (sessionData == null)//!first msg
            {
                string strDefaultWorker = "worker#0";
                if (m_ffrpc.IsExistNode(strDefaultWorker) == false)
                {
                    //ffsocket.Close();
                    FFLog.Error(string.Format("gate worker[{0}] not exist", strDefaultWorker));
                    FFNet.SendMsg(ffsocket, 256, Util.String2Byte("server is busy!0x0!你好"));
                    return;
                }
                Int64      sessionIDNew = ++m_nIDGenerator;
                ClientInfo cinfo        = new ClientInfo()
                {
                    sockObj = ffsocket, sessionID = sessionIDNew, strAllocWorker = strDefaultWorker
                };
                ffsocket.SetSessionData(sessionIDNew);
                m_dictClients[sessionIDNew] = cinfo;
                RouteLogicMsg(cinfo, cmd, strMsg, true);
                return;
            }
            Int64 sessionID = (Int64)sessionData;

            if (m_dictClients.ContainsKey(sessionID) == false)
            {
                return;
            }
            ClientInfo cinfo2 = m_dictClients[sessionID];

            RouteLogicMsg(cinfo2, cmd, strMsg, false);
        }
예제 #3
0
파일: ffnet.cs 프로젝트: xcschina/h2engine
 public void HandleRecv(IFFSocket ffsocket, string strData)
 {
     m_strRecvData += strData;
     while (m_strRecvData.Length >= 8)
     {
         byte[] btValue = Util.String2Byte(m_strRecvData);
         size = System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt32(btValue, 0));
         cmd  = (UInt16)System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt16(btValue, 4));
         flag = System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt16(btValue, 6));
         FFLog.Trace(string.Format("HandleRecv cmd:{0},len:{1}", cmd, size));
         if (m_strRecvData.Length < 8 + size)
         {
             break;
         }
         string strMsg = m_strRecvData.Remove(0, 8);
         if (strMsg.Length == size)
         {
             m_strRecvData = "";
         }
         else
         {
             strMsg        = strMsg.Remove(size);
             m_strRecvData = m_strRecvData.Remove(0, 8 + size);
         }
         try
         {
             m_funcMsgHandler(ffsocket, cmd, strMsg);
         }
         catch (Exception ex)
         {
             FFLog.Error("scoket.HandleRecv error:" + ex.Message);
         }
     }
 }
예제 #4
0
 public bool Close()
 {
     if (m_socketBroker != null)
     {
         m_socketBroker.Close();
         m_socketBroker = null;
     }
     return(true);
 }
예제 #5
0
 public void HandleBroken(IFFSocket ffsocket)
 {
     foreach (KeyValuePair <Int64, ClientInfo> kvp in m_dictClients)
     {
         if (kvp.Value.sockObj == ffsocket)
         {
             CleanupSession(kvp.Value, true);
             break;
         }
     }
 }
예제 #6
0
        public void HandleMsg(IFFSocket ffsocket, UInt16 cmd, byte[] strMsg)
        {
            //FFLog.Trace(string.Format("FFBroker handleMsg....{0}, {1} [{2}]", cmd, strMsg.Length, System.Threading.Thread.CurrentThread.ManagedThreadId.ToString()));
            try
            {
                switch ((FFRPC_CMD)cmd)
                {
                case FFRPC_CMD.REGISTER_TO_BROKER_REQ:
                {
                    RegisterToBrokerReq reqMsg = new RegisterToBrokerReq();
                    FFNet.DecodeMsg(reqMsg, strMsg);
                    FFLog.Trace(string.Format("FFBroker handleMsg.REGISTER_TO_BROKER_REQ....{0}, {1}", reqMsg.Node_type, reqMsg.Service_name));
                    if (FFRPC_NODE_TYPE.RPC_NODE == (FFRPC_NODE_TYPE)reqMsg.Node_type)
                    {
                        if (m_brokerData.Service2node_id.ContainsKey(reqMsg.Service_name))
                        {
                            FFLog.Error(string.Format("FFBroker handleMsg servicename exist....{0}, {1}", reqMsg.Node_type, reqMsg.Service_name));
                            ffsocket.Close();
                            return;
                        }
                        Int64 nNodeID = allocNodeId();
                        m_dictSockets[nNodeID] = ffsocket;
                        m_brokerData.Service2node_id[reqMsg.Service_name] = nNodeID;
                        m_brokerData.Node_id = nNodeID;
                        SyncNodeInfo(m_brokerData, ffsocket);        //!广播给所有的子节点
                    }
                } break;

                case FFRPC_CMD.BROKER_ROUTE_MSG:
                {
                    BrokerRouteMsgReq reqMsg = new BrokerRouteMsgReq();
                    FFNet.DecodeMsg(reqMsg, strMsg);
                    FFLog.Trace(string.Format("FFBroker.BROKER_ROUTE_MSG service={0},func={1} Callback={2}",
                                              reqMsg.Dest_service_name, reqMsg.Dest_msg_name, reqMsg.Callback_id));
                    if (!m_dictSockets.ContainsKey(reqMsg.Dest_node_id))
                    {
                        return;
                    }
                    IFFSocket destSocket = m_dictSockets[reqMsg.Dest_node_id];
                    FFNet.SendMsg(destSocket, (UInt16)FFRPC_CMD.BROKER_TO_CLIENT_MSG, reqMsg);
                } break;

                default: break;
                }
            }
            catch (Exception ex)
            {
                FFLog.Error("FFBroker.Error:" + ex.Message);
            }
        }
예제 #7
0
        public bool ConnectToBroker()
        {
            m_socketBroker = FFNet.Connect(m_strBrokerHost, new SocketMsgHandler(HandleMsg), new SocketBrokenHandler(HandleBroken));
            if (null == m_socketBroker)
            {
                return(false);
            }
            RegisterToBrokerReq reqMsg = new RegisterToBrokerReq {
                Node_type = 2, Service_name = m_strServiceName
            };

            FFNet.SendMsg(m_socketBroker, (UInt16)FFRPC_CMD.REGISTER_TO_BROKER_REQ, reqMsg);
            return(true);
        }
예제 #8
0
 private void SyncNodeInfo(RegisterToBrokerRet retMsg, IFFSocket ffsocket)//! 同步给所有的节点,当前的各个节点的信息
 {
     //!广播给所有的子节点
     foreach (IFFSocket s in m_dictSockets.Values)
     {
         if (s == ffsocket)
         {
             retMsg.Register_flag = 1;
         }
         else
         {
             retMsg.Register_flag = 0;
         }
         FFNet.SendMsg(s, (UInt16)FFRPC_CMD.REGISTER_TO_BROKER_RET, retMsg);
     }
 }
예제 #9
0
파일: ffnet.cs 프로젝트: xcschina/h2engine
        public static void SendMsg(IFFSocket ffsocket, UInt16 cmdSrc, byte[] strData)
        {
            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));
        }
예제 #10
0
        public static void SendMsg(IFFSocket ffsocket, UInt16 cmdSrc, byte[] strData)
        {
            if (ffsocket.GetProtocolType() == "websocket-text")
            {
                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));
        }
예제 #11
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;
        }
예제 #12
0
 public static void SendMsg(IFFSocket ffsocket, UInt16 cmd, Thrift.Protocol.TBase reqMsg)
 {
     byte[] strData = EncodeMsg(reqMsg);
     SendMsg(ffsocket, cmd, strData);
 }
예제 #13
0
 public void HandleBroken(IFFSocket ffsocket)
 {
     m_funcBroken(ffsocket);
 }
예제 #14
0
 public void HandleBroken(IFFSocket ffsocket)
 {
 }
예제 #15
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);
            }
        }
예제 #16
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);
                }
            }
        }