relayserver.cpp

来自「国外网游源码....除工具源码缺少之外,其余程序都全...至于,什么游戏,因为国」· C++ 代码 · 共 240 行

CPP
240
字号
#include "stdafx.h"
#include "RelayServer.h"
#include "msgHandler.h"


#ifdef _LOG_GAMELOGIC
	char log_result[1024];
	char *log_mode[] = {"MODE_NONE", "MODE_NORMAL", "MODE_CLAN", "MODE_SURVIVAL", "MODE_DEATH", "MODE_FLAG", "MODE_STRIKE"};
#else ifdef _DBG_GAMELOGIC
	char log_result[1024];
	char *log_mode[] = {"MODE_NONE", "MODE_NORMAL", "MODE_CLAN", "MODE_SURVIVAL", "MODE_DEATH", "MODE_FLAG", "MODE_STRIKE"};
#endif



CRelayServer g_cRelayServer;

extern float fs_frame;


CRelayServer::CRelayServer()
{
	m_msgInfo = NULL;
}

CRelayServer::~CRelayServer()
{
	net_free();

	SAFE_DELETE(m_msgInfo);
}

void CRelayServer::LoadINI()
{
	//辑滚矫胶袍
	GetPrivateProfileString("SYSTEM", "MASTERSERVER_IP", NULL, m_cConfig.sys_master_ip, sizeof(m_cConfig.sys_master_ip), RSINIT);

	m_cConfig.sys_master_port = GetPrivateProfileInt("SYSTEM", "MASTERSERVER_PORT", 0, RSINIT);
	m_cConfig.sys_port_udp = GetPrivateProfileInt("SYSTEM", "UDP_PORT", 0, RSINIT);
	m_cConfig.sys_maxuser = GetPrivateProfileInt("CONFIG", "MAX_USER", 0, RSINIT);
	m_cConfig.sys_maxlocal = GetPrivateProfileInt("SYSTEM", "MAX_LOCAL", 1, RSINIT);
	m_cConfig.sys_frame = GetPrivateProfileInt("SYSTEM", "FS_FRAME", 120, RSINIT);
	m_cConfig.sys_account = GetPrivateProfileInt("SYSTEM", "ACCOUNT", 0, RSINIT);
	m_cConfig.sys_udp_cnt = GetPrivateProfileInt("SYSTEM", "UDP_COUNT", 0, RSINIT);
}

BOOL CRelayServer::SetupSystem()
{
	fs_frame = (float)m_cConfig.sys_frame;

	return TRUE;
}

BOOL CRelayServer::SetupNetwork()
{
	void (*ThreadFunc[40])(void *) = {AverageThread, NULL, };
	void *ThreadParam[40] = {NULL, NULL, };

	net_init(1, _printf);
	net_setup(CallbackConnect, CallbackRecv, CallbackClose, ThreadFunc, ThreadParam, 1);

	if(!net_startup(m_cConfig.sys_port_udp, m_cConfig.sys_udp_cnt))
		return FALSE;

	m_msgInfo = new MSGINFO;

	return TRUE;
}

void CRelayServer::AverageThread(void *pArg)
{
	Sleep(1000);

	if(g_cRelayServer.m_bExit)	return;

	void *ioc = net_message(M_RELAYSERVER, S_LOAD_BALANCE);
	if(ioc)
	{
		UINT64 nRecvSize;

		int i=0;
		while(i < g_cRelayServer.m_cConfig.sys_udp_cnt)
		{
			nRecvSize = udp_total_recvsize(i);

			net_packet(ioc, &nRecvSize, 1);

			++i;
		}

		g_cRelayServer.SendMaster(ioc);
	}

	udp_total_recvclear();
}

BOOL CRelayServer::Init()
{
	LoadINI();

	if(!SetupSystem())
	{
		_printf("InitError[CRelayServer::SetupSystem() == false] CRelayServer::Init()\n");
		return FALSE;
	}
	if(!SetupNetwork())
	{
		_printf("InitError[CRelayServer::SetupNetwork() == false] CRelayServer::Init()\n");
		return FALSE;
	}
	if(!CServer::Init(0))
	{
		_printf("InitError[CServer::Init() == false] CRelayServer::Init()\n");
		return FALSE;
	}

#ifdef _MODE_SERVICE
	if(!net_connect(m_cConfig.sys_master_ip, m_cConfig.sys_master_port, NET_COMMON, S_HEARTBEAT))
		return FALSE;
#else
	if(!net_connect(m_cConfig.sys_master_ip, m_cConfig.sys_master_port, USE_SECURITYPACK, S_HEARTBEAT))
		return FALSE;
#endif

	m_bRun = TRUE;

	return TRUE;
}

CClient *CRelayServer::OnAccept(int nSockIndex, DWORD dwAddr)
{
	return NULL;
}

void CRelayServer::OnConnect(int nSockIndex, char *pAddr, WORD wPort)
{
	m_cConfig.sys_master_server = (short)nSockIndex;
}

void CRelayServer::OnClose(int nSockIndex, bool bNormal)
{
}

void CRelayServer::OnRecv(int nSockIndex, int nMessage, DWORD dwErrCode, char *pPacket, DWORD *pSize)
{
	switch(MAIN(nMessage))
	{
	case M_MASTERSERVER:
		switch(SUB(nMessage))
		{
		case S_CLOSED:
			_printf("**********************************exception************************************\n");
			_log("ConnectError[MASTERSERVER] CRelayServer::OnRecv() > S_CLOSED");
			break;
		case S_AUTHOR:
#ifdef _DBG_ENGINE
			_printf("[%d:%u] M_MASTERSERVER::S_AUTHOR\n", nSockIndex, GetTickCount());
#endif
			msrs_author(nSockIndex, pPacket);
			break;
		case S_VERIFY:
#ifdef _DBG_ENGINE
			_printf("[%d:%u] M_MASTERSERVER::S_VERIFY(OK)\n", nSockIndex, GetTickCount());
#endif
			msrs_verify(nSockIndex, pPacket);
			break;
		case S_LOGIN:
#ifdef _DBG_ENGINE
			_printf("[%d:%u] M_MASTERSERVER::S_LOGIN\n", nSockIndex, GetTickCount());
#endif
			msrs_login(nSockIndex, pPacket);
			break;
		}
		break;
	}
}

BOOL CRelayServer::Run()
{
	if(!CServer::Run())
		return FALSE;

	net_setevent(0, true);
	return TRUE;
}

BOOL CRelayServer::IsStopping()
{
	return TRUE;
}

BOOL CRelayServer::SendMaster(void *ioc)
{
	return net_send(m_cConfig.sys_master_server, ioc);
}

void CRelayServer::Open()
{
	char *szMode[] = {"烹钦", "辑官捞国", "单胶概摹", "标惯", "痢飞"};

	char *pAddr, *pDomain;
	if(!net_info(pAddr, pDomain))		return;

	char szTitle[256];

	if(m_cConfig.sys_mode)
	{
		if(m_cConfig.sys_udp_cnt > 1)
		{
			sprintf(szTitle, "%s:%s - %s - %s:%d~%d - %s",
				m_cConfig.sys_name, m_cConfig.sys_group, m_cConfig.sys_type, szMode[m_cConfig.sys_mode],
				pAddr, m_cConfig.sys_port_udp, m_cConfig.sys_port_udp + m_cConfig.sys_udp_cnt - 1, pDomain);
		}
		else
		{
			sprintf(szTitle, "%s:%s - %s - %s:%d - %s",
				m_cConfig.sys_name, m_cConfig.sys_group, m_cConfig.sys_type, szMode[m_cConfig.sys_mode],
				pAddr, m_cConfig.sys_port_udp, pDomain);
		}
	}
	else
	{
		if(m_cConfig.sys_udp_cnt > 1)
		{
			sprintf(szTitle, "%s:%s - %s - %s:%d~%d - %s",
				m_cConfig.sys_name, m_cConfig.sys_group, m_cConfig.sys_type,
				pAddr, m_cConfig.sys_port_udp, m_cConfig.sys_port_udp + m_cConfig.sys_udp_cnt - 1, pDomain);
		}
		else
		{
			sprintf(szTitle, "%s:%s - %s - %s:%d - %s",
				m_cConfig.sys_name, m_cConfig.sys_group, m_cConfig.sys_type,
				pAddr, m_cConfig.sys_port_udp, pDomain);
		}
	}

	_console_title(szTitle);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?