C++实现的分布式游戏服务端引擎KBEngine详解

这篇文章主要详细介绍了C++实现的分布式游戏服务端引擎KBEngine的概念以及使用方法,非常的实用,有需要的小伙伴可以参考下

KBEngine 是一款开源的游戏服务端引擎,使用简单的约定协议就能够使客户端与服务端进行交互,
使用KBEngine插件能够快速与(Unity3D, OGRE, Cocos2d, HTML5, 等等)技术结合形成一个完整的客户端。

服务端底层框架使用c++编写,游戏逻辑层使用Python(支持热更新),开发者无需重复的实现一些游戏服务端通用的底层技术,
将精力真正集中到游戏开发层面上来,快速的打造各种网络游戏。

(经常被问到承载上限,kbengine底层架构被设计为多进程分布式动态负载均衡方案,
理论上只需要不断扩展硬件就能够不断增加承载上限,单台机器的承载上限取决于游戏逻辑本身的复杂度。)

cstdkbe.hpp

 /* This source file is part of KBEngine For the latest info, see http://www.kbengine.org/ Copyright (c) 2008-2012 KBEngine. KBEngine is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. KBEngine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with KBEngine. If not, see . */ #ifndef KBE_CSTDKBE_HPP #define KBE_CSTDKBE_HPP #include "cstdkbe/platform.hpp" #include "cstdkbe/singleton.hpp" #include "cstdkbe/kbeversion.hpp" #include "cstdkbe/kbemalloc.hpp" #include "cstdkbe/stringconv.hpp" #include "cstdkbe/format.hpp" namespace KBEngine{ /** 安全的释放一个指针内存 */ #define SAFE_RELEASE(i)                   \ if (i)                         \ {                          \ delete i;                    \ i = NULL;                    \ } /** 安全的释放一个指针数组内存 */ #define SAFE_RELEASE_ARRAY(i)                \ if (i)                         \ {                          \ delete[] i;                   \ i = NULL;                    \ } #ifdef CODE_INLINE #define INLINE  inline #else #define INLINE #endif /** kbe时间 */ extern GAME_TIME g_kbetime; /** 账号的类别 */ enum ACCOUNT_TYPE { ACCOUNT_TYPE_NORMAL = 1,  // 普通账号 ACCOUNT_TYPE_MAIL = 2,   // email账号(需激活) ACCOUNT_TYPE_SMART = 3   // 智能识别 }; enum ACCOUNT_FLAGS { ACCOUNT_FLAG_NORMAL = 0x00000000, ACCOUNT_FLAG_LOCK = 0x000000001, ACCOUNT_FLAG_NOT_ACTIVATED = 0x000000002 }; /** entity的mailbox类别 */ enum ENTITY_MAILBOX_TYPE { MAILBOX_TYPE_CELL                        = 0, MAILBOX_TYPE_BASE                        = 1, MAILBOX_TYPE_CLIENT                       = 2, MAILBOX_TYPE_CELL_VIA_BASE                   = 3, MAILBOX_TYPE_BASE_VIA_CELL                   = 4, MAILBOX_TYPE_CLIENT_VIA_CELL                  = 5, MAILBOX_TYPE_CLIENT_VIA_BASE                  = 6, }; /** mailbox的类别对换为字符串名称 严格和ENTITY_MAILBOX_TYPE索引匹配 */ const char ENTITY_MAILBOX_TYPE_TO_NAME_TABLE[][8] = { "cell", "base", "client", "cell", "base", "client", "client", }; /** 定义服务器各组件类别 */ enum COMPONENT_TYPE { UNKNOWN_COMPONENT_TYPE = 0, DBMGR_TYPE       = 1, LOGINAPP_TYPE      = 2, BASEAPPMGR_TYPE     = 3, CELLAPPMGR_TYPE     = 4, CELLAPP_TYPE      = 5, BASEAPP_TYPE      = 6, CLIENT_TYPE       = 7, MACHINE_TYPE      = 8, CONSOLE_TYPE      = 9, MESSAGELOG_TYPE     = 10, BOTS_TYPE        = 11, WATCHER_TYPE      = 12, BILLING_TYPE      = 13, COMPONENT_END_TYPE   = 14, }; /** 当前服务器组件类别和ID */ extern COMPONENT_TYPE g_componentType; extern COMPONENT_ID g_componentID; /** 定义服务器各组件名称 */ const char COMPONENT_NAME[][255] = { "unknown", "dbmgr", "loginapp", "baseappmgr", "cellappmgr", "cellapp", "baseapp", "client", "kbmachine", "console", "messagelog", "bots", "watcher", "billing", }; const char COMPONENT_NAME_1[][255] = { "unknown  ", "dbmgr   ", "loginapp  ", "baseappmgr ", "cellappmgr ", "cellapp  ", "baseapp  ", "client   ", "kbmachine ", "console  ", "messagelog ", "bots", "watcher", "billing", }; inline const char* COMPONENT_NAME_EX(COMPONENT_TYPE CTYPE) { if(CTYPE <0 || ctype>= COMPONENT_END_TYPE) { return COMPONENT_NAME[UNKNOWN_COMPONENT_TYPE]; } return COMPONENT_NAME[CTYPE]; } inline const char* COMPONENT_NAME_EX_1(COMPONENT_TYPE CTYPE) { if(CTYPE <0 || ctype>= COMPONENT_END_TYPE) { return COMPONENT_NAME_1[UNKNOWN_COMPONENT_TYPE]; } return COMPONENT_NAME_1[CTYPE]; } inline COMPONENT_TYPE ComponentName2ComponentType(const char* name) { for(int i=0; i<(int)COMPONENT_END_TYPE; i++) { if(kbe_stricmp(COMPONENT_NAME[i], name) == 0) return (COMPONENT_TYPE)i; } return UNKNOWN_COMPONENT_TYPE; } // 所有的组件列表 const COMPONENT_TYPE ALL_COMPONENT_TYPES[] = {BASEAPPMGR_TYPE, CELLAPPMGR_TYPE, DBMGR_TYPE, CELLAPP_TYPE, BASEAPP_TYPE, LOGINAPP_TYPE, MACHINE_TYPE, CONSOLE_TYPE, MESSAGELOG_TYPE, WATCHER_TYPE, BILLING_TYPE, BOTS_TYPE, UNKNOWN_COMPONENT_TYPE}; // 所有的后端组件列表 const COMPONENT_TYPE ALL_SERVER_COMPONENT_TYPES[] = {BASEAPPMGR_TYPE, CELLAPPMGR_TYPE, DBMGR_TYPE, CELLAPP_TYPE, BASEAPP_TYPE, LOGINAPP_TYPE, MACHINE_TYPE, MESSAGELOG_TYPE, WATCHER_TYPE, BILLING_TYPE, BOTS_TYPE, UNKNOWN_COMPONENT_TYPE}; // 所有的后端组件列表 const COMPONENT_TYPE ALL_GAME_SERVER_COMPONENT_TYPES[] = {BASEAPPMGR_TYPE, CELLAPPMGR_TYPE, DBMGR_TYPE, CELLAPP_TYPE, BASEAPP_TYPE, LOGINAPP_TYPE, BILLING_TYPE, UNKNOWN_COMPONENT_TYPE}; // 所有的辅助性组件 const COMPONENT_TYPE ALL_HELPER_COMPONENT_TYPE[] = {MESSAGELOG_TYPE, UNKNOWN_COMPONENT_TYPE}; // 返回是否是一个有效的组件 #define VALID_COMPONENT(C_TYPE) ((C_TYPE) > 0 && (C_TYPE) = 256) return false; for(int i=0; i= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || (ch == '_')) continue; return false; } return true; } inline bool validName(const std::string& name) { return validName(name.c_str(), name.size()); } /** 检查email地址合法性 严格匹配请用如下表达式 [a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])? */ #ifdef USE_REGEX #include  #endif inline bool email_isvalid(const char *address) { #ifdef USE_REGEX std::tr1::regex _mail_pattern("([a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)"); return std::tr1::regex_match(accountName, _mail_pattern); #endif int len = strlen(address); if(len <= 3) return false; char ch = address[len - 1]; if(!((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9'))) return false; int    count = 0; const char *c, *domain; static const char *rfc822_specials = "()<>@,;:\\\"[]"; /* first we validate the name portion (name@domain) */ for (c = address; *c; c++) { if (*c == '\"' && (c == address || *(c - 1) == '.' || *(c - 1) == '\"')) { while (*++c) { if (*c == '\"') break; if (*c == '\\' && (*++c == ' ')) continue; if (*c <= ' ' || *c >= 127) return false; } if (!*c++) return false; if (*c == '@') break; if (*c != '.') return false; continue; } if (*c == '@') break; if (*c <= ' ' || *c >= 127) return false; if (strchr(rfc822_specials, *c)) return false; } if (c == address || *(c - 1) == '.') return false; /* next we validate the domain portion (name@domain) */ if (!*(domain = ++c)) return false; do { if (*c == '.') { if (c == domain || *(c - 1) == '.') return false; count++; } if (*c <= ' ' || *c >= 127) return false; if (strchr(rfc822_specials, *c)) return false; } while (*++c); return (count >= 1); } } #endif // KBE_CSTDKBE_HPP 

以上所述就是本文的全部内容了,有需要的小伙伴可以参考下。

以上就是C++实现的分布式游戏服务端引擎KBEngine详解的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » C语言