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

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 <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 type
enum 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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索分布式
, 游戏服务端引擎
KBEngine
kbengine 详解、kbengine服务器引擎、geem2引擎服务端、分布式搜索引擎、ask引擎服务端,以便于您获取更多的相关知识。

时间: 2024-10-30 17:50:09

C++实现的分布式游戏服务端引擎KBEngine详解_C 语言的相关文章

KBEngine v0.9.14 发布,分布式游戏服务端引擎

分布式游戏服务端引擎 KBEngine v0.9.14 发布了.更新如下: 新增与改善: cellapp增加支持registerReadFileDescriptor之类的API接口 增加配置选项解决在端口映射环境强制暴露公网IP地址提供客户端登陆时,机器人程序不能直接走内网登陆问题.(#478) log4cxx_properties日志配置文件可以在子项目中重写,避免多个不同子项目需要改动底层默认格式引起冲突.(#479) 当进程与logger异常断开连接后,一部分缓存待发送的log也将输出到日

subversion服务端配置步骤详解_Linux

配置过程:1.安装subversion 服务端软件 复制代码 代码如下: yum install subersion -ymkdir -p /data/svn_svncd  /data/svn_svn 2. 创建代码仓库 复制代码 代码如下: svnadmin create  svn_version 配置权限 复制代码 代码如下: vim conf/svnserve.confpassword-db = passwd  #取消注释anon-access = noneauth-access = wr

lamp下Nagios 服务端安装过程详解

前提:LAMP环境搭建完成 备注:经过Centos6.4.Centos6.5.Centos7.0测试试用! 脚本: #!/bin/bash # Author:Byrd # Version:1.0 # Site:www.t4x.org # Contact:root#t4x.org #This script for Nagios-V3.5.1 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export

服务端常规知识详解

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 公司老项目的后台,均是基于spring框架搭建,其中还用到了log4j.jar等开源架包.在新项目中,则是spring和hibernate框架均有使用,利用了hibernate框架,来实现持久化,简化sql操作等.Hibernate配置文件可以有两种格式,一种是 hibernate.properties,另一种是 hibernate.cfg.xml.后者稍微

关于大小端、位域的一些概念详解_C 语言

大小端: 对于像C++中的char这样的数据类型,它本身就是占用一个字节的大小,不会产生什么问题.但是当数制类型为int,在32bit的系统中,它需要占用4个字节(32bit),这个时候就会产生这4个字节在寄存器中的存放顺序的问题.比如int maxHeight = 0x12345678,&maxHeight = 0x0042ffc4.具体的该怎么存放呢?这个时候就需要理解计算机的大小端的原理了. 大端:(Big-Endian)就是把数值的高位字节放在内存的低位地址上,把数值的地位字节放在内存的

c++-C++如何开发游戏服务端?

问题描述 C++如何开发游戏服务端? 对于动作类.格斗类游戏,有一个很大的问题,就是需要做碰撞检查和寻路. 如果是单机游戏,客户端有非常非常多的引擎,例如unity3d等. 但如果是网游对战游戏,如果都是客户端判断的话,容易不同步,也容易作弊. 我想请问,服务端做碰撞检查的话,有没有类似的引擎? 如果没有,一般该如何处理? 解决方案 你没有了解过游戏开发.根本不需要将这种表现同步. 动作类游戏,每个目标在服务端就是一个点,二点之间有攻击距离,在攻击距离内就可以攻击,否则不能,客户端发起攻击请求然

Java服务端压缩GZIP IOS解压问题

问题描述 Java服务端压缩GZIP IOS解压问题 在Java端用什么方法加压GZIP 在IOS端能解压出来 IOS用libz库方式解压的 求大神解答..找了很多种压缩方式都不行 IOS一直解压不出来 解决方案 iOS与Java服务器GZip压缩问题iOS与Java服务器GZip压缩问题iOS与Java服务器GZip压缩问题 解决方案二: 一般都是用标准的gzip压缩格式 各种平台都是一样的 你要看看java是否压缩正确了 用其它工具能否解压成功

网易正式发布Pomelo开源游戏服务端框架

网易,一个依靠游戏打下中国互联网半壁江山的公司.在10月20日的杭州源创会上,来自网易的谢骋超为大家介绍了网易即将开源的基于 Node.js 的游戏服务器框架 Pomelo (柚子),并称该框架将于11月正式开源. 谢骋超,网易杭州研究高级程序专家,2006年浙江大学硕士毕业后加入网易,参与过网易博客开发,主持过博客圈子,及开放平台等开发,2年前转向游戏开发领域. 专注于服务端开发技术,对高性能高并发网站(游戏)的架构设计.调优有较丰富经验. 对node.js与java开发有丰富的经验.目前是p

网易正式发布 Pomelo 开源游戏服务端框架

10月20日的开源中国 杭州源创会 上,来自网易的 @谢骋超为大家介绍了网易即将开源的基于 Node.js 的游戏服务器框架 Pomelo (柚子),并称该框架将于11月正式开源. 今天这个框架终于正式跟我们大家见面了,采用 MIT 授权协议,非常完善的中英文架构说明和开发手册,文档一直是国内开源项目的软肋,而 Pomelo 一经推出便提供如此全面的文档,这是国内开源项目非常难得的,可见网易在这方面做了非常充分的准备工作. Pomelo 是由网易开发的基于node.js 开发的高性能.分布式游戏