// 清理停止连接代理,服务启动时调用,比如服务异常退出,则启动前调用该函数,关闭之前的代理连接 void CLogicHandler::cleanUpConnectProxy(const unsigned int proxyId[], const unsigned int len) { m_connectMgr->clearConnectProxy(); m_service->cleanUpProxy(proxyId, len); ReleaseWarnLog("clean up connect proxy, service id = %u, name = %s", getSrvId(), getSrvName()); }
// 停止连接代理,服务停止时调用 void CLogicHandler::stopConnectProxy() { m_connectMgr->clearConnectProxy(); m_service->stopProxy(); ReleaseWarnLog("stop connect proxy, service id = %u, name = %s", getSrvId(), getSrvName()); }
// 定时保存数据到redis服务 void CSrvMsgHandler::saveDataToDb(unsigned int timerId, int userId, void* param, unsigned int remainCount) { static const unsigned int gatewayProxySrvId = getSrvId(); m_gatewayProxySrvData.curTimeSecs = time(NULL); int rc = m_redisDbOpt.setHField(GatewayProxyListKey, GatewayProxyListKeyLen, (const char*)&gatewayProxySrvId, sizeof(gatewayProxySrvId), (const char*)&m_gatewayProxySrvData, sizeof(m_gatewayProxySrvData)); if (rc != 0) OptErrorLog("in saveDataToDb set gateway proxy service data to redis center service failed, rc = %d", rc); }
// 加载模块 void CModule::doLoad(unsigned short moduleId, const char* srvName, const unsigned int srvId, CConnectMgr* connectMgr, CCfg* srvMsgCommCfg) { m_moduleId = moduleId; m_connectMgr = connectMgr; m_srvMsgCommCfg = srvMsgCommCfg; m_context.dstSrvId = getSrvId(); m_context.dstModuleId = m_moduleId; onLoad(srvName, srvId, m_moduleId); onRegister(srvName, srvId, m_moduleId); // 在此注册本模块处理的协议函数,绑定协议ID到实现函数 }
void CSrvMsgHandler::onLoad(const char* srvName, const unsigned int srvId, unsigned short moduleId) { if (!GatewayProxyConfig::config::getConfigValue(CCfg::getValue("GatewayProxyService", "BusinessXmlConfigFile")).isSetConfigValueSuccess()) { ReleaseErrorLog("set business xml config value error"); stopService(); return; } const DBConfig::config& dbCfg = DBConfig::config::getConfigValue(CCfg::getValue("GatewayProxyService", "DbConfigFile")); if (!dbCfg.isSetConfigValueSuccess()) { ReleaseErrorLog("set db xml config value error"); stopService(); return; } if (!m_redisDbOpt.connectSvr(dbCfg.redis_db_cfg.center_db_ip.c_str(), dbCfg.redis_db_cfg.center_db_port, dbCfg.redis_db_cfg.center_db_timeout * MillisecondUnit)) { ReleaseErrorLog("gateway connect center redis service failed, ip = %s, port = %u, time out = %u", dbCfg.redis_db_cfg.center_db_ip.c_str(), dbCfg.redis_db_cfg.center_db_port, dbCfg.redis_db_cfg.center_db_timeout); stopService(); return; } static const unsigned int gatewayProxySrvId = getSrvId(); m_gatewayProxySrvData.ip = CSocket::toIPInt(CCfg::getValue("NetConnect", "NetIP")); // 外网IP m_gatewayProxySrvData.port = atoi(CCfg::getValue("NetConnect", "Port")); m_gatewayProxySrvData.curTimeSecs = time(NULL); m_gatewayProxySrvData.currentPersons = 0; int rc = m_redisDbOpt.setHField(GatewayProxyListKey, GatewayProxyListKeyLen, (const char*)&gatewayProxySrvId, sizeof(gatewayProxySrvId), (const char*)&m_gatewayProxySrvData, sizeof(m_gatewayProxySrvData)); if (rc != 0) { ReleaseErrorLog("set gateway proxy service data to redis center service failed, rc = %d", rc); stopService(); return; } m_gameHallId = GatewayProxyConfig::config::getConfigValue().commonCfg.game_hall_id; // 定时保存数据到redis unsigned int millisecondUnit = 1000; // 秒转换为毫秒乘值 unsigned int timerId = setTimer(millisecondUnit * atoi(CCfg::getValue("GatewayProxyService", "SaveDataToDBInterval")), (TimerHandler)&CSrvMsgHandler::saveDataToDb, 0, NULL, (unsigned int)-1); ReleaseInfoLog("gateway message handler load, service name = %s, id = %d, timer id = %u", srvName, srvId, timerId); }
//handles incoming messages void handlMsg(char *msg, int sock, skaddr *addr,int size,int type){ char *msgType; char srvId[SRV_ADDR_LEN]; memset(srvId,0,SRV_ADDR_LEN); if(msg && addr){ msgType=parseTocken(msg,1,DELIMITER,strlen(msg)); getSrvId(msg,srvId,type); if(msgType){ if(strcmp(msgType,UPDATE)==0){ updateSrvs(msg,srvId); } else if(strcmp(msgType,ACK)==0){ if(strcmp(srvId,NEWSERVER)!=0) saveServ(addr,srvId,type); sendAck(srvId,sock,addr,size); } else if(strcmp(msgType,FINAL)==0){ removeServ(srvId); sendFin(srvId,sock,addr,size); } free(msgType); } } }