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;
}