魔兽世界服务器Trinitycore分析二:auth server的main函数

TrinityCore由生成两个执行文件authserver和world server以及一堆DLL(或so)文件的子项目组成(先忽略map_extractor等几个工具项目)。

authserver是登录验证服,它主要提供登录验证和获取服务器(区服)列表的功能。world server是真正的游戏服务器,提供游戏里的一切功能。相对而言,auth server比较简单,那我就从它入手啊,先看一下它的main函数,在源码的基础上,我加上了注释。

//该函数在src\server\authserver\Main.cpp中
int main(int argc, char** argv)
{
    std::string configFile = _TRINITY_REALM_CONFIG;

    //读取程序的参数,存入variables_map中
    //如果参数中含有help,则输出信息,中止程序
    auto vm = GetConsoleArguments(argc, argv, configFile);
    // exit if help is enabled
    if (vm.count("help"))
        return 0;

    //读取配置文件
    std::string configError;
    if (!sConfigMgr->LoadInitial(configFile, configError))
    {
        printf("Error in config file: %s\n", configError.c_str());
        return 1;
    }

    //向控制台输出一配置信息
    TC_LOG_INFO("server.authserver", "%s (authserver)", _FULLVERSION);
    TC_LOG_INFO("server.authserver", "<Ctrl-C> to stop.\n");
    TC_LOG_INFO("server.authserver", "Using configuration file %s.", configFile.c_str());
    TC_LOG_INFO("server.authserver", "Using SSL version: %s (library: %s)", OPENSSL_VERSION_TEXT, SSLeay_version(SSLEAY_VERSION));
    TC_LOG_INFO("server.authserver", "Using Boost version: %i.%i.%i", BOOST_VERSION / 100000, BOOST_VERSION / 100 % 1000, BOOST_VERSION % 100);

    // authserver PID file creation
    //创建一个文件,向其中写入PID
    std::string pidFile = sConfigMgr->GetStringDefault("PidFile", "");
    if (!pidFile.empty())
    {
        if (uint32 pid = CreatePIDFile(pidFile))
            TC_LOG_INFO("server.authserver", "Daemon PID: %u\n", pid);
        else
        {
            TC_LOG_ERROR("server.authserver", "Cannot create PID file %s.\n", pidFile.c_str());
            return 1;
        }
    }

    // Initialize the database connection
    //初始化程序的数据库连接
    if (!StartDB())
        return 1;

    // Get the list of realms for the server
    //初始化world server列表
    //也就是在auth数据库执行:"SELECT id, name, address, localAddress, localSubnetMask, port, icon,
    //flag, timezone, allowedSecurityLevel, population, gamebuild FROM realmlist WHERE flag <> 3 ORDER BY name"
    //并将结果存入单例类RealmList的m_realms中
    sRealmList->Initialize(_ioService, sConfigMgr->GetIntDefault("RealmsStateUpdateDelay", 20));

    if (sRealmList->size() == 0)
    {
        TC_LOG_ERROR("server.authserver", "No valid realms specified.");
        StopDB();
        return 1;
    }

    // Start the listening port (acceptor) for auth connections
    //从配置文件中读取监听的IP和端口
    int32 port = sConfigMgr->GetIntDefault("RealmServerPort", 3724);
    if (port < 0 || port > 0xFFFF)
    {
        TC_LOG_ERROR("server.authserver", "Specified port out of allowed range (1-65535)");
        StopDB();
        return 1;
    }

    std::string bindIp = sConfigMgr->GetStringDefault("BindIP", "0.0.0.0");

    //初始化auth server
    AsyncAcceptor<AuthSession> authServer(_ioService, bindIp, port);

    // Set signal handlers
    //绑定SIGINT(退出)信号的处理函数
    boost::asio::signal_set signals(_ioService, SIGINT, SIGTERM);
#if PLATFORM == PLATFORM_WINDOWS
    signals.add(SIGBREAK);
#endif
    signals.async_wait(SignalHandler);

    // Set process priority according to configuration settings
    //设置进程(线程)的优先级
    SetProcessPriority("server.authserver");

    // Enabled a timed callback for handling the database keep alive ping
    //增加一个定时器,用于与数据库保持心跳连接
    _dbPingInterval = sConfigMgr->GetIntDefault("MaxPingTime", 30);
    _dbPingTimer.expires_from_now(boost::posix_time::minutes(_dbPingInterval));
    _dbPingTimer.async_wait(KeepDatabaseAliveHandler);

    // Start the io service worker loop
    //开始事件循环
    _ioService.run();

    // Close the Database Pool and library
    //关闭数据库
    StopDB();

    TC_LOG_INFO("server.authserver", "Halting process...");
    return 0;
}
				
时间: 2024-12-07 00:23:59

魔兽世界服务器Trinitycore分析二:auth server的main函数的相关文章

魔兽世界服务器Trinitycore分析三:auth server网络事件的处理

authserver在初始化静态变量时,会调用AuthSession::InitHandlers(),初始化全局的业务哈希表Handlers: std::unordered_map<uint8, AuthHandler> AuthSession::InitHandlers() { std::unordered_map<uint8, AuthHandler> handlers; handlers[AUTH_LOGON_CHALLENGE] = { STATUS_CONNECTED,

魔兽世界服务器Trinitycore分析一:前言

一:简介 帖一段官网介绍吧 TrinityCore is a MMORPG Framework based mostly in C++. Itis derived from MaNGOS,the Massive Network Game Object Server,and is based on the code of that project with extensive changes over time tooptimize, improve and cleanup the codebas

魔兽世界服务器Trinitycore分析三:日志模块

一:日志接口 TrinityCore的日志有六个级别:Trace,Debug,Info,Warn,Error,Fatal 它们分别对应以下这六个接口,(filterType__也是在配置文件中指定的) #define TC_LOG_TRACE(filterType__, ...) #define TC_LOG_DEBUG(filterType__, ...) #define TC_LOG_INFO(filterType__, ...) #define TC_LOG_WARN(filterType

三大WEB服务器对比分析(apache ,lighttpd,nginx)

一.软件介绍(apache  lighttpd  nginx) 1. lighttpd Lighttpd是一个具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点.lighttpd是众多OpenSource轻量级的web server中较为优秀的一个.支持FastCGI, CGI, Auth, 输出压缩(output compress), URL重写, Alias等重要功能. Lighttpd使用fastcgi方式运行php,它会使用很少的PHP进程响应很大的并发量. Fastcg

Redis数据持久化机制AOF原理分析二

Redis数据持久化机制AOF原理分析二 分类: Redis 2014-01-12 15:36  737人阅读  评论(0)  收藏  举报 redis AOF rewrite 目录(?)[+] 本文所引用的源码全部来自Redis2.8.2版本. Redis AOF数据持久化机制的实现相关代码是redis.c, redis.h, aof.c, bio.c, rio.c, config.c 在阅读本文之前请先阅读Redis数据持久化机制AOF原理分析之配置详解文章,了解AOF相关参数的解析,文章链

[Java聊天室服务器]实战之二 监听类

前言 学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比如最近在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)

Docker Registry v2 + Token Auth Server (Registry v2 认证)实例。

关于Registry 对于registry v1 --> v2中,其中的原理.优化等,这里不再做一一介绍.这里有篇文章我瞄过几眼应该是比较不错的介绍文章了:http://dockone.io/article/747 . Registry v2 token机制 官方document:https://docs.docker.com/registry/spec/auth/token/ 目前docker registry v2 认证分为以下6个步骤: 1. docker client 尝试到regist

传奇源码分析-客户端(游戏逻辑处理源分析二)

5.接受登录成功后,接收GameSrv服务器发送的消息:接收GameGate发送的消息:CClientSocket::OnSocketMessage的FD_READ事件中,PacketQ.PushQ((BYTE*)pszPacket);把接收到的消息,压入PacketQ队列中.处理PacketQ队列数据是由CGameProcess::Load()时调用OnTimer在CGameProcess::OnTimer中处理的, 处理过程为:OnMessageReceive; ProcessPacket(

Tiny Web服务器代码分析

Tiny Web服务器代码分析 <深入理解计算机系统>中开发了一个小但是功能齐全的称为Tiny的web服务器,这里是Tiny服务器的源码解析. 1.Tiny的main程序 Tiny是一个迭代服务器,通过命令行中传递来的端口值,调用Open_listenfd()函数打开一个监听套接字,然后Tiny执行无限循环:服务器阻塞在accept,等待监听描述符listenfd上的连接请求,当服务器从accept返回connfd,表明已经与客户端建立起了连接,执行事务,并关闭连接它的那一端,进行下一次循环.