距离上次写博客已经大半年了,这大半年中经历了很多的人和事,并且也收获了很多,所在的项目组游戏已经成功上线运营了,在此稍微花点时间记录一下这大半年在业余时间做的一些技术积累吧,在此就以堪称是“大魔兽私服”服务器框架——Mangos来做些框架设计上的分享吧,Mangos整体看来还是1:n模式的架构,底层的采用了多线程的IO,而游戏的主逻辑依旧是单线程的,Mangos服务器框架主要是基于ACE开源库的,很早之前就有接触过ACE,但是没有做个比较大的项目,正好借此机会来加深一下如何用ACE来架设服务器框架的能力,好了,下面简要的介绍一下Mangos的架构吧:在Mangos中,主要分为了两类服务器,一类服务器就是我们常说的登陆服务器,也叫大厅服务器,而第二类服务器就是我们常说的游戏逻辑服务器,下面我们就从大厅服务器说起吧,Mangos大厅服务器设计的其实很简单,采用的是单线程的方式,主要是负责接收登陆请求,验证请求以及针对验证通过的请求发送游戏逻辑服务器的地址(游戏区的信息),接下去来看看,大厅服务器的简要代码吧:
1.大厅服务器主流程:
extern int main(int argc,char** argv)
{
char const* cfg_file = "readmd.conf";
char const* options = ":c:s";
ACE_Get_Opt cmd_opts(argc,argv,options);
cmd_opts.long_option("version",'v');
char serviceDaemonMode = '\0';
int option;
while((option =cmd_opts())!=EOF)
{
switch (option)
{
case 'c':
cfg_file = cmd_opts.opt_arg();
break;
case 'p':
printf("loginServer config\n");
return 0;
case 's':
{
const char* mode = cmd_opts.opt_arg();
if(!strcmp(mode,"run"))
serviceDaemonMode = 'r';
#ifdef WIN32
else if(!strcmp(mode,"install"))
serviceDaemonMode = 'i';
else if(!strcmp(mode,"uninstall"))
serviceDaemonMode = 'u';
#else
#endif
else
{
printf("Runtime-Error: -%c unsupported argument %s",cmd_opts.opt_opt(),mode);
return 1;
}
break;
}
default:
break;
}
}
#ifdef WIN32
switch (serviceDaemonMode)
{
case 'i':
WinServiceInstall();
return 1;
case 'u':
WinServiceUnInstall();
return 1;
case 'r':
WinServiceRun();
break;
default: