KBEngine 是一款開源的游戲服務端引擎,使用簡單的約定協議就能夠使客戶端與服務端進行交互,
使用KBEngine插件能夠快速與(Unity3D, OGRE, Cocos2d, HTML5, 等等)技術結合形成一個完整的客戶端。
服務端底層框架使用c++編寫,游戲邏輯層使用Python(支持熱更新),開發者無需重復的實現一些游戲服務端通用的底層技術,
將精力真正集中到游戲開發層面上來,快速的打造各種網絡游戲。
(經常被問到承載上限,kbengine底層架構被設計為多進程分布式動態負載均衡方案,
理論上只需要不斷擴展硬件就能夠不斷增加承載上限,單臺機器的承載上限取決于游戲邏輯本身的復雜度。)
cstdkbe.hpp
/*This source file is part of KBEngineFor the latest info, see http://www.kbengine.org/ Copyright (c) 2008-2012 KBEngine. KBEngine is free software: you can redistribute it and/or modifyit under the terms of the GNU Lesser General Public License as published bythe 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 ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public Licensealong with KBEngine. If not, see <http://www.gnu.org/licenses/>.*/#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) < COMPONENT_END_TYPE) // 前端應用的類別, All client typeenum COMPONENT_CLIENT_TYPE{ UNKNOWN_CLIENT_COMPONENT_TYPE = 0, // 移動類,手機,平板電腦 // Mobile, Phone, Pad(Allowing does not contain Python-scripts and entitydefs analysis, can be imported protocol from network) CLIENT_TYPE_MOBILE = 1, // 獨立的Windows/Linux/Mac應用程序(包含python腳本,entitydefs解析與檢查entitydefs的MD5,原生的) // Windows/Linux/Mac Application program (Contains the Python-scripts, entitydefs parsing and check entitydefs-MD5, Native) CLIENT_TYPE_PC = 2, // 不包含Python腳本,entitydefs協議可使用網絡導入 // Web, HTML5, Flash CLIENT_TYPE_BROWSER = 3, // 包含Python腳本,entitydefs解析與檢查entitydefs的MD5,原生的 // bots (Contains the Python-scripts, entitydefs parsing and check entitydefs-MD5, Native) CLIENT_TYPE_BOTS = 4, // 輕端類, 可不包含python腳本,entitydefs協議可使用網絡導入 // Mini-Client(Allowing does not contain Python-scripts and entitydefs analysis, can be imported protocol from network) CLIENT_TYPE_MINI = 5, // End CLIENT_TYPE_END = 6 }; /** 定義前端應用的類別名稱 */const char COMPONENT_CLIENT_NAME[][255] = { "UNKNOWN_CLIENT_COMPONENT_TYPE", "CLIENT_TYPE_MOBILE", "CLIENT_TYPE_PC", "CLIENT_TYPE_BROWSER", "CLIENT_TYPE_BOTS", "CLIENT_TYPE_MINI",}; // 所有前端應用的類別const COMPONENT_CLIENT_TYPE ALL_CLIENT_TYPES[] = {CLIENT_TYPE_MOBILE, CLIENT_TYPE_PC, CLIENT_TYPE_BROWSER, CLIENT_TYPE_BOTS, CLIENT_TYPE_MINI, UNKNOWN_CLIENT_COMPONENT_TYPE}; typedef int8 CLIENT_CTYPE; // 前端是否支持浮點數// #define CLIENT_NO_FLOAT // 一個cell的默認的邊界或者最小大小#define CELL_DEF_MIN_AREA_SIZE 500.0f /** 一個空間的一個chunk大小 */#define SPACE_CHUNK_SIZE 100 /** 檢查用戶名合法性 */inline bool validName(const char* name, int size){ if(size >= 256) return false; for(int i=0; i<size; i++) { char ch = name[i]; if((ch >= '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 <regex>#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
以上所述就是本文的全部內容了,有需要的小伙伴可以參考下。
新聞熱點
疑難解答
圖片精選