c++遊戲服務端中使用configurator讀取配置文件信息

c++遊戲服務端中使用configurator讀取配置文件信息

       寫遊戲服務端時候我們通常都需要動態配置一下服務器信息,如數據庫連結信息,遊戲邏輯Socket信息,線程池大小等等。我們都寫在一個配置文件在遊戲服務器啓動時候,讀取該文件進行相應配置。有人喜歡用.ini方式配置文件,對於c++我更喜歡用Configurator框架讀取。所以我先寫一個配置文件game.conf:

//數據庫連接信息
DbName      : xxxGameDb
DbHost      : 192.168.0.183
DbPort      : 3306
DbUser      : xxxGame
DbPassword  : xxxGame

 

//遊戲服務器ip端口信息

<Server>
    REMOTE_HOST  : 192.168.0.100
    REMOTE_PORT  :  443
                
    BDPOOL_CONNECTION_COUNT: 10
    TASK_START_DETAL:   5000

    StorePath       : /game/path/log                  
  
  
    ReconnectPeriod : 10
</Server>

 

 

 

#include <configurator/configurator.hpp>

#include <iostream>

 

//註冊需要讀取的配置項,即讀該配置項信息,如果沒有配置則使用default_value來配置

void register_options( cf::single_configurator& configurator ) {
    configurator.add_option( "DbName" );
    configurator.add_option( "DbHost" );
    configurator.add_option( "DbPort" );
    configurator.add_option( "DbUser" );
    configurator.add_option( "DbPassword" );

    configurator.in_section( "Server" );
    configurator.add_option_here( "REMOTE_HOST" )   .default_value( "127.0.0.1" )  .check_semanti( cf::ip )
                ;
    configurator.add_option_here( " REMOTE_PORT" )   .default_value( 443)     ;

    configurator.add_option_here( "StorePath" )
                .check_semantic( cf::path );
    configurator.add_option_here( "ReconnectPeriod" )
                .necessary();
    
 
}

 

 

void view_options_values( cf::single_configurator& configurator ) {
    std::string name;
    std::string host;
    unsigned int port = 0;
    std::string user;
    std::string password;
    configurator.get_value( "DbName", name )
                .get_value( "DbHost", host )
                .get_value( "DbPort", port )
                .get_value( "DbUser", user )
                .get_value( "DbPassword", password )
                ;
    std::cout << "db name: "     << name << std::endl;
    std::cout << "db host: "     << host << std::endl;
    std::cout << "db port: "     << port << std::endl;
    std::cout << "db user: "     << user << std::endl;
    std::cout << "db password: " << password << std::endl;

    configurator.from_section( "Server" );
    std::string serv_host   = configurator.get_value_from_here( "Host" );
    unsigned int serv_port  = configurator.get_value_from_here< unsigned int >( "Port" );
    std::string admin_email = configurator.get_value_from_here( "Administrator" );
    std::string store_path  = configurator.get_value_from_here( "StorePath" );
    size_t period           = configurator.get_value_from_here< size_t >( "ReconnectPeriod" );

    std::cout << "From Server: " << std::endl;
    std::cout << "  serv_host: "    << serv_host << std::endl;
    std::cout << "  serv_port: "    << serv_port << std::endl;

    std::cout << "  store_path: "   << store_path << std::endl;
    std::cout << "  period: "       << period << std::endl;
   
}

 

 

int main( int argc, char* argv[] )

{

 

//初始化配置信息configurator 
    try {

 

       //很明顯這裏是一個單例模式
        cf::single_configurator& configurator = cf::single_configurator::inst();
        configurator.set_name_value_separator( ':' );
        configurator.set_case_sensitivity_for_names();

        register_options( configurator );
       
        configurator.parse( "/some/path/to/game.conf" );
// 我們的配置信息在這裏
        
        view_options_values( configurator );//測試一下我們讀取到配置信息
    } catch ( const std::exception& exc ) {
  std::cerr << exc.what() << std::endl;
 }

    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章