亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++實現的分布式游戲服務端引擎KBEngine詳解

2020-01-26 15:08:31
字體:
來源:轉載
供稿:網友

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久成人av网站| 日韩av综合网| 亚洲第一男人av| 亚洲欧美国产一区二区三区| 成人观看高清在线观看免费| 中文字幕一区二区三区电影| 亚洲成人在线网| 欧美亚洲一级片| www.欧美精品一二三区| 亚洲午夜精品久久久久久性色| 欧美日韩激情视频| 色婷婷综合久久久久中文字幕1| 欧美成人午夜免费视在线看片| 5566日本婷婷色中文字幕97| 国产精品午夜一区二区欲梦| 日韩在线播放一区| 国产精品99久久久久久www| 欧美精品第一页在线播放| 琪琪第一精品导航| 欧美插天视频在线播放| 久久影视免费观看| 亚洲成人免费在线视频| 日韩免费av一区二区| 亚洲自拍偷拍网址| 成人午夜在线观看| 久久久久久久久久久成人| 欧美日韩国产丝袜美女| 国产精品jizz在线观看麻豆| 国产精品三级网站| 成人免费视频在线观看超级碰| 正在播放欧美视频| 亚洲欧美日韩精品| www.欧美三级电影.com| 91av中文字幕| 国产精品女人网站| 日韩精品极品在线观看播放免费视频| 日韩高清电影好看的电视剧电影| 国产精品黄页免费高清在线观看| 亚洲精品美女免费| 国产精品白嫩初高中害羞小美女| 国产精品福利在线观看| 欧美另类极品videosbestfree| 成人有码在线播放| 亚洲国产99精品国自产| 91久久夜色精品国产网站| 在线日韩欧美视频| 亚洲午夜精品久久久久久久久久久久| 成人午夜高潮视频| 国产一区二区三区毛片| 国内精品久久影院| 欧美性猛交xxx| 伊人伊成久久人综合网站| 亚洲精品美女久久| 日韩午夜在线视频| 亚洲成人在线网| 国产精品美腿一区在线看| 国产亚洲免费的视频看| 日韩中文av在线| 中文字幕av一区中文字幕天堂| 久久中文精品视频| 欧美午夜精品久久久久久浪潮| 77777亚洲午夜久久多人| 欧美大尺度在线观看| 欧美视频一二三| 国产精品久久久久久搜索| 亚洲图中文字幕| 色噜噜狠狠狠综合曰曰曰88av| 久久精品国产精品| 亚洲国产精彩中文乱码av在线播放| 亚洲性无码av在线| 欧美黑人性生活视频| 国产欧美日韩丝袜精品一区| 欧美高跟鞋交xxxxxhd| 欧美特级www| 亚洲欧美资源在线| 久久久精品视频在线观看| 成人a在线观看| 国产精品一区久久久| 永久免费看mv网站入口亚洲| 日韩一区二区三区国产| 狠狠色噜噜狠狠狠狠97| 日韩国产欧美精品一区二区三区| 日日摸夜夜添一区| 国产精品99久久久久久www| 国产精品高清在线观看| 日韩精品免费在线观看| 国产91精品黑色丝袜高跟鞋| 日韩中文有码在线视频| 国产美女扒开尿口久久久| 日本最新高清不卡中文字幕| 亚洲精品wwwww| 亚洲色图激情小说| 大胆人体色综合| 欧美精品制服第一页| 亚洲老头老太hd| 亚洲综合av影视| 欧美色另类天堂2015| 欧洲美女免费图片一区| 日韩在线观看成人| 国产精品激情自拍| 日韩精品福利在线| 一个人www欧美| 欧美诱惑福利视频| 欧美激情a∨在线视频播放| 国产一区二区三区丝袜| 国产欧美最新羞羞视频在线观看| 亚洲免费影视第一页| 欧美成人午夜免费视在线看片| 国产精品久久一区| 国产精品成人一区| 欧美综合国产精品久久丁香| 久久久精品电影| 日本中文字幕不卡免费| 久青草国产97香蕉在线视频| 美女999久久久精品视频| 亚洲国产精品成人va在线观看| 国外成人在线播放| 精品国产欧美一区二区三区成人| 97涩涩爰在线观看亚洲| 国产91精品网站| 一区二区三区视频观看| 日韩中文字幕视频在线观看| 欧美日韩国产影院| 亚洲成年人在线| 亚洲人在线视频| 国产精品视频专区| 97超碰蝌蚪网人人做人人爽| 狠狠色噜噜狠狠狠狠97| 欧美xxxx做受欧美| 精品精品国产国产自在线| 2019中文字幕免费视频| 欧美激情亚洲另类| 97视频com| 国产欧美日韩免费| 亚洲毛片在线观看| 北条麻妃在线一区二区| 综合网日日天干夜夜久久| 国产视频精品久久久| 免费91在线视频| 中文字幕亚洲情99在线| 国产精品视频久久| 欧美日韩亚洲精品内裤| 在线观看国产精品91| 91精品国产高清久久久久久| 91sao在线观看国产| 亚洲精品日韩av| 成人免费福利视频| 精品电影在线观看| 久久影视电视剧免费网站| 色多多国产成人永久免费网站| 亚洲第一综合天堂另类专| 国产精品福利在线| 日本成熟性欧美| 日韩极品精品视频免费观看| 国产日韩在线观看av| 欧美日韩国产色视频| 亚洲欧美中文日韩v在线观看| 中文一区二区视频| www.午夜精品| 日韩免费看的电影电视剧大全| 亚洲午夜激情免费视频| 久久久av网站| 久久久国产一区二区三区| 欧美日韩不卡合集视频|