// 清理停止连接代理,服务启动时调用,比如服务异常退出,则启动前调用该函数,关闭之前的代理连接
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);
}
Ejemplo n.º 4
0
// 加载模块			   
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);
}
Ejemplo n.º 6
0
//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);
		}
	}  
}