C++實(shí)現(xiàn)的分布式游戲服務(wù)端引擎KBEngine詳解
KBEngine 是一款開源的游戲服務(wù)端引擎,使用簡單的約定協(xié)議就能夠使客戶端與服務(wù)端進(jìn)行交互,
使用KBEngine插件能夠快速與(Unity3D, OGRE, Cocos2d, HTML5, 等等)技術(shù)結(jié)合形成一個(gè)完整的客戶端。
服務(wù)端底層框架使用c++編寫,游戲邏輯層使用Python(支持熱更新),開發(fā)者無需重復(fù)的實(shí)現(xiàn)一些游戲服務(wù)端通用的底層技術(shù),
將精力真正集中到游戲開發(fā)層面上來,快速的打造各種網(wǎng)絡(luò)游戲。
(經(jīng)常被問到承載上限,kbengine底層架構(gòu)被設(shè)計(jì)為多進(jìn)程分布式動(dòng)態(tài)負(fù)載均衡方案,
理論上只需要不斷擴(kuò)展硬件就能夠不斷增加承載上限,單臺(tái)機(jī)器的承載上限取決于游戲邏輯本身的復(fù)雜度。)
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 <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{
/** 安全的釋放一個(gè)指針內(nèi)存 */
#define SAFE_RELEASE(i) \
if (i) \
{ \
delete i; \
i = NULL; \
}
/** 安全的釋放一個(gè)指針數(shù)組內(nèi)存 */
#define SAFE_RELEASE_ARRAY(i) \
if (i) \
{ \
delete[] i; \
i = NULL; \
}
#ifdef CODE_INLINE
#define INLINE inline
#else
#define INLINE
#endif
/** kbe時(shí)間 */
extern GAME_TIME g_kbetime;
/** 賬號的類別 */
enum ACCOUNT_TYPE
{
ACCOUNT_TYPE_NORMAL = 1, // 普通賬號
ACCOUNT_TYPE_MAIL = 2, // email賬號(需激活)
ACCOUNT_TYPE_SMART = 3 // 智能識(shí)別
};
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的類別對換為字符串名稱 嚴(yán)格和ENTITY_MAILBOX_TYPE索引匹配 */
const char ENTITY_MAILBOX_TYPE_TO_NAME_TABLE[][8] =
{
"cell",
"base",
"client",
"cell",
"base",
"client",
"client",
};
/** 定義服務(wù)器各組件類別 */
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,
};
/** 當(dāng)前服務(wù)器組件類別和ID */
extern COMPONENT_TYPE g_componentType;
extern COMPONENT_ID g_componentID;
/** 定義服務(wù)器各組件名稱 */
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};
// 返回是否是一個(gè)有效的組件
#define VALID_COMPONENT(C_TYPE) ((C_TYPE) > 0 && (C_TYPE) < COMPONENT_END_TYPE)
// 前端應(yīng)用的類別, All client type
enum COMPONENT_CLIENT_TYPE
{
UNKNOWN_CLIENT_COMPONENT_TYPE = 0,
// 移動(dòng)類,手機(jī),平板電腦
// Mobile, Phone, Pad(Allowing does not contain Python-scripts and entitydefs analysis, can be imported protocol from network)
CLIENT_TYPE_MOBILE = 1,
// 獨(dú)立的Windows/Linux/Mac應(yīng)用程序(包含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協(xié)議可使用網(wǎng)絡(luò)導(dǎo)入
// 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協(xié)議可使用網(wǎng)絡(luò)導(dǎo)入
// 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
};
/** 定義前端應(yīng)用的類別名稱 */
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",
};
// 所有前端應(yīng)用的類別
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;
// 前端是否支持浮點(diǎn)數(shù)
// #define CLIENT_NO_FLOAT
// 一個(gè)cell的默認(rèn)的邊界或者最小大小
#define CELL_DEF_MIN_AREA_SIZE 500.0f
/** 一個(gè)空間的一個(gè)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地址合法性
嚴(yán)格匹配請用如下表達(dá)式
[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
以上所述就是本文的全部內(nèi)容了,有需要的小伙伴可以參考下。
欄 目:C語言
本文標(biāo)題:C++實(shí)現(xiàn)的分布式游戲服務(wù)端引擎KBEngine詳解
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/3107.html
您可能感興趣的文章
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 01-10c語言求1+2+...+n的解決方法
- 01-10求子數(shù)組最大和的解決方法詳解
- 01-10深入理解約瑟夫環(huán)的數(shù)學(xué)優(yōu)化方法
- 01-10深入二叉樹兩個(gè)結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)的詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)- 解析最少換車次數(shù)的問題詳解
- 01-10c語言 跳臺(tái)階問題的解決方法


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法


