多进程的游戏服务器的应用场景下:
网关的功能:
过滤消息、转发消息、广播消息、消息校验和踢除非法消息的玩家(加速和发假消息)
角色校验
创建、删除、查询角色
网关连接:
网关会主动连接所有的场景服务器、中心服务器、数据服务器、社会服务器。
本文内容:
1、网关的初始化
2、网关的处理登录服务器的消息
3、处理其他服务器转发来的共享消息(场景等服务器发来的)
4、处理中心服务器发来的消息
1、网关的初始化
(1)网关的连接池(主动、被动)初始化。连接线程连接中心服务器。绑定网关端口。启动逻辑线程。初始化网关屏索引。
主动连接线程池主动连接所有场景服务器、社会服务器、数据服务器。
在中心服务器连接验证成功后,网关会通知网关的服务器id、ip地址、端口、网络类型到登录服务器。网关以后每次增加网关连接管理器的连接数,会通知连接数到登录服务器。
bool gateway_server::init()
{//指令检测开关
verify_client_version = atoi(TITAN_VERSION);
g_log->info("服务器版本号:%d",verify_client_version);
taskPool = new tcp_session_pool(2048, 65000);
if (NULL == taskPool
|| !taskPool->init())
return false;
clientPool = new tcp_client_pool(g_xml_config.get_integer("Global.Gateway.LinkServerNumber"),8000);
if (NULL == clientPool
|| !clientPool->init())
return false;
strncpy(pstrIP, tcp_socket::getIPByIfName(g_xml_config.get_string("Global.NetCard.Config")), MAX_IP_LENGTH - 1);
if (!sub_server::init())
{
return false;
}
const ServerEntry *serverEntry = NULL;
//g_log->debug(__PRETTY_FUNCTION__);
//连接Social服务器(社会关系服务器)
serverEntry = getServerEntryByType(SOCIALSERVER);
if (NULL == serverEntry)
{
g_log->error("不能找到Social服务器相关信息,不能连接Social服务器");
return false;
}
socialClient = new social_client("Social", serverEntry->pstrExtIP, serverEntry->wdExtPort,serverEntry->ServerID);
if(! socialClient || !clientPool->put(socialClient))
{
g_log->error("连接Social服务器失败 %s", __PRETTY_FUNCTION__);
return false;
}
//连接所有的档案服务器(数据库服务器)
serverEntry = getServerEntryByType(DBSERVER);
if (NULL == serverEntry)
{
g_log->error("不能找到Record服务器相关信息,不能连接Record服务器");
return false;
}
dbClient = new db_client("Record", serverEntry->pstrExtIP, serverEntry->wdExtPort,serverEntry->ServerID);
if(!dbClient || !clientPool->put(dbClient))
{
g_log->error("没有足够内存,不能建立Record服务器客户端实例");
return false;
}
//连接所有的场景服务器
serverEntry = getServerEntryByType