masterserver.cpp

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

CPP
1,076
字号
#include "stdafx.h"
#include "MasterServer.h"
#include "spHandler.h"
#include "msgHandler.h"
#include "manager.h"
#include "local.h"
#include "user.h"
#include "weapon.h"
#include "assist.h"
#include "mechanic.h"


CMasterServer g_cMasterServer;

char use_type[] = {'U', 'T', 'D', 'P'};	//enum:USE_TYPE

extern float fs_frame;


CMasterServer::CMasterServer()
{
	m_cpManager = NULL;
	m_cpLocal = NULL;
	m_cpUser = NULL;
	m_cpItemMap = NULL;

	m_msgInfo = NULL;
	m_spInfo = NULL;
	m_spSendQ = NULL;
	m_spRecvQ = NULL;
}

CMasterServer::~CMasterServer()
{
	db_free();
	net_free();

	SAFE_DELETE(m_msgInfo);
	SAFE_DELETE(m_spInfo);
	SAFE_DELETE(m_spSendQ);
	SAFE_DELETE(m_spRecvQ);

	SAFE_DELETE(m_cpItemMap);
	SAFE_DELETE(m_cpManager);
	SAFE_DELETE_ARRAY(m_cpLocal);
	SAFE_DELETE_ARRAY(m_cpUser);
}

void CMasterServer::LoadINI()
{
	//辑滚矫胶袍
	GetPrivateProfileString("SYSTEM", "NAME", NULL, m_cConfig.sys_name, sizeof(m_cConfig.sys_name), MSINIT);
	GetPrivateProfileString("SYSTEM", "GROUP", NULL, m_cConfig.sys_group, sizeof(m_cConfig.sys_group), MSINIT);

	m_cConfig.sys_port_tcp = GetPrivateProfileInt("CONFIG", "TCP_PORT", 0, MSINIT);
	m_cConfig.sys_port_udp = GetPrivateProfileInt("CONFIG", "UDP_PORT", 0, MSINIT);
	m_cConfig.sys_maxuser = GetPrivateProfileInt("CONFIG", "MAX_USER", 3000, MSINIT);
	m_cConfig.sys_maxlocal = GetPrivateProfileInt("CONFIG", "MAX_LOCAL", 50, MSINIT);
	m_cConfig.sys_cgiproc = GetPrivateProfileInt("CONFIG", "MAX_CGIPROC", 1, MSINIT);
	m_cConfig.sys_frame = GetPrivateProfileInt("CONFIG", "FS_FRAME", 120, MSINIT);
	m_cConfig.sys_block_cnt = GetPrivateProfileInt("CONFIG", "CNT_BLOCK_IP", 0, MSINIT);

	m_cConfig.sys_version_hi = GetPrivateProfileInt("GAME", "VERSION_HI", 0, MSINIT);
	m_cConfig.sys_version_lo = GetPrivateProfileInt("GAME", "VERSION_LO", 0, MSINIT);
}

BOOL CMasterServer::SetupSystem()
{
	char line[LEN_BUFFER+1];
	char ip[LEN_IP+1];
	char source[LEN_SVRNAME+1];
	char database[LEN_SVRNAME+1];
	char id[LEN_ID+1];
	char pwd[LEN_PWD+1];
	char szItemFile[LEN_FILENAME+1];
	char *connection;

	if(m_cConfig.sys_block_cnt)
		m_cConfig.sys_block_addr = new DWORD[m_cConfig.sys_block_cnt];

	int i=0;
	while(i < MAX_CONNECTION_DB)
	{
		GetPrivateProfileString("LIST_CONNECTION_DB", itoa(i, id, 10), NULL, line, sizeof(line), MSINIT);
		sscanf(line, "%s %s %s %s", database, source, id, pwd);
		db_connectionf(connection, source, database, id, pwd);

		m_cConfig.sys_connection_db[i] = new char[strlen(connection)+1];
		strcpy(m_cConfig.sys_connection_db[i], connection);
		++i;
	}

	i=0;
	while(i < m_cConfig.sys_block_cnt)
	{
		GetPrivateProfileString("LIST_BLOCK_IP", itoa(i, id, 10), NULL, line, sizeof(line), MSINIT);
		sscanf(line, "%s", ip);

		m_cConfig.sys_block_addr[i] = inet_addr(ip);
		++i;
	}


	m_cpItemMap = new CItemMap;

	//公扁酒捞袍颇老 肺爹
	itemfile<CWeapon, WEAPON_DATA> weapon;
	GetPrivateProfileString("GAME", "WEAPON_ITEMFILE", NULL, szItemFile, sizeof(szItemFile), MSINIT);
	if(!weapon.load_itemfile(szItemFile, m_cpItemMap))		return FALSE;
	//焊炼酒捞袍颇老 肺爹
	itemfile<CAssist, ASSIST_DATA> assist;
	GetPrivateProfileString("GAME", "ASSIST_ITEMFILE", NULL, szItemFile, sizeof(szItemFile), MSINIT);
	if(!assist.load_itemfile(szItemFile, m_cpItemMap))		return FALSE;
	//皋墨葱酒捞袍颇老 肺爹
	itemfile<CMechanic, MECHANIC_DATA> mechanic;
	GetPrivateProfileString("GAME", "MECHANIC_ITEMFILE", NULL, szItemFile, sizeof(szItemFile), MSINIT);
	if(!mechanic.load_itemfile(szItemFile, m_cpItemMap))	return FALSE;

	//辑滚府胶飘 沥焊啊 乐绰 皋牢DB.
	//饶俊, 拌距 阂捞青栏肺 捞 单捞磐甫 昏力 肚绰 函版窍搁 辑厚胶甫 瞒窜且 荐 乐促
	db_connectionf(connection, DBMAIN_DSN, DBMAIN_DBN, DBMAIN_DSA, DBMAIN_DSP);
	m_cConfig.sys_connection_db[MAX_CONNECTION_DB] = new char[strlen(connection)+1];
	strcpy(m_cConfig.sys_connection_db[MAX_CONNECTION_DB], connection);

	fs_frame = (float)m_cConfig.sys_frame;

	return TRUE;
}

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

	int i=0;
	while(i < m_cConfig.sys_cgiproc)
	{
		ThreadFunc[i] = SPThread;
		++i;
	}

	net_init(m_cConfig.sys_maxuser, 0, _printf);
	net_setup(CallbackAccept, CallbackConnect, CallbackRecv, CallbackClose, ThreadFunc, ThreadParam, m_cConfig.sys_cgiproc);

	m_cConfig.sys_udp_cnt = 2;

#ifdef	_MODE_SERVICE
	if(!net_startup(m_cConfig.sys_port_tcp, m_cConfig.sys_port_udp, m_cConfig.sys_udp_cnt, NET_COMMON, S_HEARTBEAT))
		return FALSE;
#else
	if(!net_startup(m_cConfig.sys_port_tcp, m_cConfig.sys_port_udp, m_cConfig.sys_udp_cnt, NET_FLAG(USE_SECURITYPACK), S_HEARTBEAT))
		return FALSE;
#endif

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

	m_msgInfo = new MSGINFO;

	char szTitle[256];
	GetWindowText(m_cpManager->m_hConsole, szTitle, sizeof(szTitle));

	if(m_cConfig.sys_udp_cnt > 1)
	{
		sprintf(szTitle+strlen(szTitle), " - %s:%d:%d~%d - %s",
			pAddr, m_cConfig.sys_port_tcp, m_cConfig.sys_port_udp,
			m_cConfig.sys_port_udp + m_cConfig.sys_udp_cnt - 1, pDomain);
	}
	else
	{
		sprintf(szTitle+strlen(szTitle), " - %s:%d:%d - %s",
			pAddr, m_cConfig.sys_port_tcp, m_cConfig.sys_port_udp, pDomain);
	}

	_console_title(szTitle);

	return TRUE;
}

BOOL CMasterServer::SetupDatabase()
{
	m_spInfo = new mempool<SPINFO>(m_cConfig.sys_maxuser);
	m_spSendQ = new queue<SPINFO *>(m_cConfig.sys_maxuser);
	m_spRecvQ = new queue<SPINFO *>(m_cConfig.sys_maxuser);

	m_cLocalConn.local_limit = m_cConfig.sys_maxlocal;
	m_cLocalConn.account = new UINT64[m_cLocalConn.local_limit];
	m_cLocalConn.type = new char*[m_cLocalConn.local_limit];
	m_cLocalConn.name = new char*[m_cLocalConn.local_limit];
	m_cLocalConn.mode = new char*[m_cLocalConn.local_limit];

	int i=m_cLocalConn.local_limit;
	while(i--)
	{
		m_cLocalConn.account[i] = 0;
		m_cLocalConn.type[i] = new char[LEN_SVRNAME+1];
		m_cLocalConn.name[i] = new char[LEN_SVRNAME+1];
		m_cLocalConn.mode[i] = new char[LEN_SVRNAME+1];
	}

	db_init(64, _printf);
	m_dbMain.Open(m_cConfig.sys_connection_db[MAX_CONNECTION_DB]);
	m_dbGame.Open(m_cConfig.sys_connection_db[0]);

	i=m_cConfig.sys_cgiproc;
	while(i--)	net_setevent(i, TRUE);

	return TRUE;
}

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

	//init_manager
	m_cpManager = new CManager;
	m_cpManager->Init();

	if(!SetupSystem())
	{
		_printf("InitError[CMasterServer::SetupSystem() == false] CMasterServer::Init()\n");
		return FALSE;
	}
	if(!SetupNetwork())
	{
		_printf("InitError[CMasterServer::SetupNetwork() == false] CMasterServer::Init()\n");
		return FALSE;
	}
	if(!SetupDatabase())
	{
		_printf("InitError[CMasterServer::SetupDatabase() == false] CMasterServer::Init()\n");
		return FALSE;
	}
	if(!CServer::Init(m_cConfig.sys_maxuser))
	{
		_printf("InitError[CServer::Init() == false] CMasterServer::Init()\n");
		return FALSE;
	}

	m_cpUser = new CUser[m_cConfig.sys_maxuser];

	int i=m_cConfig.sys_maxuser;
	while(i--)	m_cpUser[i].Init(i);

	//霸烙DB俊辑 辑滚府胶飘甫 啊廉柯促
	spsel_server_info(m_cConfig.sys_name, m_cConfig.sys_group);

	m_bRun = TRUE;

	return TRUE;
}

CClient *CMasterServer::OnAccept(int nSockIndex, DWORD dwAddr)
{
	CUser *pUser = m_cpUser + nSockIndex;
	void *ioc;

	if(!pUser->Insert(dwAddr))
	{
		if((ioc = net_message(M_MASTERSERVER, S_CLOSED, 0)))
		{
			if(!net_send(pUser->m_nIndex, ioc))
				net_disconnect(pUser->m_nIndex, false);
		}
		return (CClient *)pUser;
	}

	if((ioc = net_message(M_MASTERSERVER, S_AUTHOR, 0)))
	{
		if(!net_send(pUser->m_nIndex, ioc))
			net_disconnect(pUser->m_nIndex, false);
	}

	if(m_pTag)
	{
		m_pTag->m_nUserCnt = m_nUserCnt;
		m_cpManager->SetInfoUserCnt(m_pTag);
	}

	return (CClient *)pUser;
}

void CMasterServer::OnConnect(int nSockIndex, char *pAddr, WORD wPort)
{
}

void CMasterServer::OnClose(int nSockIndex, bool bNormal)
{
	//CUser::Delete() 肚绰 CLocal::Delete()	CServer::CallbackClose()俊辑 龋免茄促
	if(m_pTag)
	{
		m_pTag->m_nUserCnt = m_nUserCnt;
		m_cpManager->SetInfoUserCnt(m_pTag);
	}
}

void CMasterServer::OnRecv(int nSockIndex, int nMessage, DWORD dwErrCode, char *pPacket, DWORD *pSize)
{
	switch(MAIN(nMessage))
	{
	case M_MASTERSERVER:	//努扼捞攫飘俊辑 柯 菩哦
		switch(SUB(nMessage))
		{
		case CMS_AUTHOR_CODE:
#ifdef _DBG_ENGINE
			_printf("[%d:%u] M_CLIENT::CMS_AUTHOR_CODE\n", nSockIndex, GetTickCount());
#endif
			cms_author_code(nSockIndex, pPacket);
			break;
		case CMS_LOGIN_INFO:
#ifdef _DBG_ENGINE
			_printf("[%d:%u] M_CLIENT::CMS_LOGIN_INFO\n", nSockIndex, GetTickCount());
#endif
			cms_login_info(nSockIndex, pPacket);
			break;
		case CMS_UDP_PING:
#ifdef _DBG_ENGINE
			_printf("[%d:%u] M_CLIENT::CMS_UDP_PING\n", nSockIndex, GetTickCount());
#endif
			cms_udp_ping(nSockIndex);
			break;

		case CMS_SERVER_REFRESH:
#ifdef _DBG_ENGINE
			_printf("[%d:%u] M_CLIENT::CMS_SERVER_REFRESH\n", nSockIndex, GetTickCount());
#endif
			msc_server_update(nSockIndex);
			break;

		case CMS_SERVER_SELECT:
#ifdef _DBG_ENGINE
			_printf("[%d:%u] M_CLIENT::CMS_SERVER_SELECT\n", nSockIndex, GetTickCount());
#endif
			cms_server_select(nSockIndex, pPacket);
			break;

		case CMS_LOGIN_BACK:
#ifdef _DBG_ENGINE
			_printf("[%d:%u] M_CLIENT::CMS_LOGIN_BACK\n", nSockIndex, GetTickCount());
#endif
			cms_login_back(nSockIndex, pPacket, *pSize);
			break;

		default:
			msc_dummy(nSockIndex, pPacket, nMessage, *pSize);
			break;
		}
		break;

	case M_LOBBYSERVER:
		switch(SUB(nMessage))
		{
		case S_AUTHOR:
#ifdef _DBG_ENGINE
			_printf("[%d:%u] M_LOBBYSERVER::S_AUTHOR\n", nSockIndex, GetTickCount());
#endif
			sms_author(nSockIndex, pPacket);
			break;
		case S_LOGIN:

⌨️ 快捷键说明

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