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 + -
显示快捷键?