自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

wintree的专栏

专注于Linux系统编程,网络编程,高性能服务器技术,c/c++技术学习

  • 博客(416)
  • 资源 (5)
  • 收藏
  • 关注

原创 服务器端开发的一些建议

摘要: 本文作为游戏服务器端开发的基本大纲,是游戏实践开发中的总结。第一部分专业基础,用于指导招聘和实习考核, 第二部分游戏入门,讲述游戏服务器端开发的基本要点,第三部分服务端架构,介绍架构设计中的一些基本原则。希望能帮到大家一 专业基础1.1 网络1.1.1 理解TCP/IP协议网络传输模型滑动窗口技术建立连接的三次握手与断开连接的四次握手连接建立与断开过程中的各种状态TCP/IP协

2016-06-24 09:44:23 10250 2

原创 c++侵入式对象计数设计技术

侵入式对象计数的设计原理相对非侵入式的来说:具有以下优点:1、一个资源对象无论被多少个侵入式智能指针包含,从始至终只有一个引用计数变量,不需要在每一个使用智能指针对象的地方都new一个计数对象,这样子效率比较高,使用内存也比较少,也比较安全;2、因为引用计数存储在对象本身,所以在函数调用的时候可以直接传递资源对象地址,而不用担心引用计数值丢失(非侵入式智能指针对象的拷贝,必须带着智能指针模

2015-12-08 20:22:22 4010

原创 支持vector,map,list<map>序列化,反序列化实现

协议序列化

2015-11-29 23:33:18 10605 5

原创 C语言实现分布式自增有序的唯一ID生成算法-snowflake算法

前41bits是以微秒为单位的timestamp。 接着10bits是事先配置好的机器ID。 最后12bits是累加计数器。 macheine id(10bits)标明最多只能有1024台机器同时产生ID,sequence number(12bits)也标明1台机器1ms中最多产生4096个ID, * 注意点,因为使用到位移运算,所以需要64位操作系统,不然生成的ID会有可能不正确

2015-11-07 13:28:14 12049

原创 原子操作的一段代码学到的知识

本实例是我在学习原子操作看到一段很有趣的程序,包含的知识很多。首先上程序:// test_atomic.cpp : 定义控制台应用程序的入口点。//#define _GNU_SOURCE#include #include #include #include #include #include #include #include #include#include#

2015-11-07 10:58:31 3154 1

原创 我的c++服务器记录----非阻塞下的socket读取操作

服务器端的基本的一个操作就是从socket的fd上进行数据读取,也就是我们经常用到的read函数。 欢迎关注我的服务器代码:http://code.taobao.org/p/fastServer/src/今天主要是关注的正确的进行read操作 首相,我的socket是已经设置了非阻塞属性。read函数在非阻塞读取fd的时候会遇到不同的errno。 如何正确的处理这些erron 状态呢?1、er

2015-07-24 23:52:43 3342

原创 无锁队列--基于linuxkfifo实现

一直想写个无锁的队列,来提高项目后台的效率。偶然看到linux内核的kfifo.h 实现原理。于是自己仿照了这个实现,目前linux应该是可以对外提供接口了。#ifndef _NO_LOCK_QUEUE_H_#define _NO_LOCK_QUEUE_H_#include #include #include #include #include #include

2015-06-15 15:37:51 3957 1

原创 游戏公会工作总结

想写这篇文章已经脱了很久了。本文主要写一写我在游戏公会组所做事情和成长吧。 在这里,首先要感谢我的前老大,技术组leader,郭文瑞,具有十几年的技术经历。技术广度和深度都是公司首屈一指的。还有他对技术的敏感程度是非常值得敬佩的。项目成立之时,感谢他对我的信任和帮助,才让我能够基本独立的完成游戏公会后台的设计,架构,开发等工作。目前,郭文瑞已经离职,在一家深圳公司做CTO。 以下我们公司的YY后台的一个整体架构以及公会组内部的一些基本关系。我们项目属于YY频道内的一个服务,YY频道内的所

2015-05-13 20:01:01 3907

原创 fastdfs学习之 选主流程

概述:(1)每个tracker服务在启动时会调用tracker_relationship_init函数启动一个线程relationship_thread_entrance。该线程会每隔几秒进行各个tracker的关系确认,若leader发生了变动,或宕机之类,会重新选出leader。(2) 调用流程main函数|-int tracker_relationship_init() 

2015-05-08 09:23:44 1804

原创 redis源码解析----epoll的使用

平时做项目,涉及到网络层的都是epoll,前几年发现redis的epoll实现起来非常的精简,好用。因为提供的接口简单,爱并实现的很高效。于是,我就提取出来,直接使用。今天又打开该文件详细的看看他的实现细节。首先简单介绍epoll,它是linux内核下的一个高效的处理大批量的文件操作符的一个实现。不仅限于socket fd。他在超时时间内会唤醒有事件的操作符。其中有两种模式 1、水平触

2015-05-02 14:14:54 6726 1

原创 删除双向链表的一个指定节点

双向链表的简单操作,供初学者学习

2015-02-27 11:29:44 9905

原创 memcached源码阅读----使用libevent和多线程模型

本篇文章主要是我今天阅读memcached源码关于进程启动,在网络这块做了哪些事情。一、iblievent的使用    首先我们知道,memcached是使用了iblievet作为网络框架的,而iblievet又是单线程模型的基于linux下epoll事件的异步模型。因此,其基本的思想就是 对可读,可写,超时,出错等事件进行绑定函数,等有其事件发生,对其绑定函数回调。

2014-09-14 23:55:12 11091

原创 redis源码解读之内存管理————zmalloc文件

本文章主要记录本人在看redis源码的一些理解和想法。因为功力有限,肯定会出现问题,所以,希望高手给出指正。第一篇就是内存相关的介绍。因为我喜欢先看一些组件的东西,再看整体的流程。先上一下代码吧头文件//主要提供内存分配和释放的基础功能void *zmalloc(size_t size);//主要提供内存分配和释放的基础功能void *zcalloc(size_t s

2014-04-21 11:55:11 5794 2

原创 工作的几个技术小点总结

这篇文章,主要是总结一下我最近工作中遇到的一些之前没有接触过的东西1.mysql数据引擎mysql 支持几种引擎,我们常见到的引擎ISAM 和INNODB,其他详细介绍可以参看其他文章,很多介绍比如http://www.cnblogs.com/xulb597/archive/2012/05/25/2518118.html这里我想说的就是,ISAM 不

2013-11-23 12:13:00 2787 3

原创 游戏架构之前端接入层

在前边几篇文章已经给大家讲过,我们游戏通过进程间异步通信的方式来实现瓶颈的最大程度的减小。前端接入层主要的做什么呢?主要是数据包的有效性验证和维持与玩家的长连接。如何做有效性的验证,我们使用过和前端具体的协议定制。然后通过我们具体的协议包头+包体的来计算。如果我们的计算和我们协议不一致,直接就断开和客户端的连接,发送rst信号,客户端会被通知到,进程会hub状态,

2013-08-30 00:17:19 4266 2

原创 mmog游戏开发之业务篇

这周不是很忙,因为我们的游戏开发了近一年,由于公司的业务调整,在游戏开第二服的时候,老板果断的把项目停到了。感觉超级的不爽啊。因为这个游戏项目像我的孩子一样和我一样成长,里边的大概的业务逻辑都是偶实现的,比如基础系统里的,任务系统,背包系统,公会系统,相关副本系统,商城系统,人物属性相关,运镖,怪物AI,技能相关,地图等等,差不多游戏里的所有业务我都有所涉及那么对于一个业务是如

2013-08-29 23:41:02 3200

原创 游戏登陆流程

今天主要讲游戏的登陆流程,由于我们的后台架构是前端接入层+后端业务进程的架构模式,因此,任何网络连接请求的数据,都要经过前端接入。首先要说明,目前大多数游戏都是 账号+角色的模式。ok登陆两种模式1,已在该服创建过账号,创建过角色的玩家2.在该服没有创建过,账号数据库是没有数据我们首先说一下我们的进程模式连接层+业务层+认证层比如,当一个玩家要玩我们的游

2013-08-15 11:08:18 3600 1

原创 游戏后台之内存管理篇

服务端程序对于内存的管理上是重中之中,如何管理好程序的内存是保证程序稳定的最重要因素。因此,我们是如何做的呢。1.我们知道,当有一个新玩家进入游戏,我们需要分配一段内存给这个玩家,当这个玩家下线了,不玩了,我们就要对这段内存进行清理。因此,如何有效的管理这段内存,如何能重新利用这段内存,是我们的问题,因此,使用内存池的方式,是比较理想的一种方式。通过内存池,我们

2013-07-27 01:29:35 3048 1

原创 游戏系统开发设计分享

我所搭建的总体架构非常简单就是前端接入进程 +后端业务逻辑处理进程+数据库缓存进程+其他协作进程一、组件基本介绍1.通信组件 所有进程使用的是单线程,没有使用其他线程。进程间通信使用我们的一个自主开发的通信组件。2.数据协议组件 我们也是自主开发的一个以xml表现形式,通过工具生成.h头文件,二进制bin文件。数据加载文件等。也可以和数据库进行交互的数据文件,也可以进行网络传输等,

2013-06-09 00:59:23 3227 3

原创 游戏地图掩码相关(msk)

在游戏的世界里,玩家在地图上的某点,是否能够走动,是否遇到障碍,是否是走到了阴影处,是否水层等等先关信息都要我们前后端知道。那么服务器是如何进行实现的呢。下面主要给大家讲讲。     首先,我们知道图片是以像素为主要为单位进行计量,但是我们后端又不能使用这个东西,在二维的世界观里,我们是以坐标(x,y)具体的表现出其某个东西,所在的位置。因此,我们就要通过这个像素来表达出地点。

2013-05-30 00:49:29 3815 1

原创 游戏后台开发九问--linux平台

在游戏中会遇到很多问题,下面大体总结:这九个选择分别是:第一,选择什么样的架构。第二,选择单线程还是多线程。第三,如何在游戏中使用脚本。第四,如何处理网络通讯。第五,如何处理游戏通信协议。第六,如何设计存储结构。第七,如何设计网络同步。第八,如何定义性能基准。第九,如何在不同项目间进行代码复用。先介绍一下在

2013-05-09 21:50:18 4972 4

原创 如何提高游戏后台数据查找效率

在游戏后台中,内存的数据查找是一个很重要,也是关系到我们游戏的后台效率的问题。在大量的数据中,我们如何让我们的的程序能够快速的查找到我们所想要的数据呢。那么我们就要使用相应的算法了。首先,我们所有使用的内存都是通过分配内存的方式,基本上都是共享内存。通过shmid来分配内存。那么游戏中有哪些数据呢。1.配置表数据,这个数据是程序启动的时候,就要加载到内存中,我们就使用了二分

2013-05-04 00:25:43 4145 6

原创 我们游戏后台架构学习

今天我们的游戏开始第一次的游客模式导入测试,出现了不少问题。这些问题主要还是基础的网络的连接这一块。但是网络连接这一块我还不是非常熟悉。有时间好好研究一下下面是使用游戏的主要架构图和主要几个关键点1 服务器采用“cluster”、“world”、“zone”三层架构,系统可灵活平行扩展  2 采用单线程,便于开发和运营;  3 采用异步消息机制,提高服务器处理性能;

2013-03-31 19:48:59 13644 8

原创 Linux 服务器后台系统架构的高性能设计

因为,目前在做游戏的的后台开发。尽管最近在忙于开发游戏业务逻辑的的相关代码,也在不停思考着游戏后台的一些架构问题。因为游戏后台处理着大部分的业务逻辑,因此。在性能上是必须的。那么如何尽最大的提高性能呢,下面根据我们后台架构提出的几点,因为我们后台架构业务逻辑是单进程将单线程处理首先,我们知道目前后台所效率上受到限制的就是 数据库IO>磁盘》网络IO>cpu>内存

2013-01-24 00:42:31 9799 1

原创 c语言实现的通用二分查找算法

///* 二分查找是基于排好序的算法。复杂度低,并且很高效, 由于项目中大量使用的了二分查找,但是又不能每个业务实现一个 因此有必要实现一个通用的二分查找 其主要思想:通过对已经排好序的数组,进行数据指针的比较。 @const void *key 需要查找的key值 @const void *base, 所要查找数据的首地址 @int nmemb,所要查找的成员数量 @int

2012-12-08 11:14:35 5972 1

原创 角色扮演类大型网络游戏C++后台和纯C语言后台的差异

因为一些原因,我从一个用c++做后台程序的工作室转到了用纯C语言作为游戏后台的工作室, 而这两套后台程序都可以号称目前中国在角色扮演类游戏中成熟的后台架构。。c++的架构我已经基本已经很清晰了,因为看了两个月代码。 而这套纯C语言的是某网络游戏公司几个比较有名的后台,中国几大国产游戏都在用。 然后切实感受到了面向对象和结构语言之间的差异。。。。  面向对象更注重

2012-11-11 01:25:52 11246 19

原创 信号量,互斥锁和条件变量之间的差异

首先信号量,互斥锁和条件变量 具体如何使用大家可以去学习UNP2进程间通信。里边以消费者生产者模型为例子,讲的很好,推荐大家学习。信号量,互斥锁和条件变量 在linux编程中,常用于线程间的同步。 在计算机中,一些资源在同一时间只允许一个线程进行修改。 那么这三者根据自身的特点,适用于什么场合,他们三者之间有什么差异呢? 下面简单的用代码来描述一下 如何使用a)互斥

2012-10-11 23:58:20 4121

原创 ]linux内核学习之网络篇——接收分组

计算机处于网络中,是不知道什么时候会发过来数据,是不可预测的。因此,目前所有的现代设备驱动程序都是使用了中断来通知内核的有 链路层的以太网帧到达。 驱动程序有特定的相应的程序,因此当有数据帧到达的时候,内核就会调用该程序。将数据从网卡上传输到物理内存中。或者通知内核延迟处理。下面一个图就是数据穿过内核的路径完整的路径 (1)net_interrupt是设备驱动程序设置的终端处理

2012-10-11 00:58:27 3407

原创 linux内核学习之网络篇——网络物理层的设备初步

网卡是是网络中最基本的硬件之一。在内核中,每个网络设备都一个一个net_device 结构体实例,在进行初始化完成之后,会将该结构注册到内核中。然能内核知道该结构的存在。这会创建一个sysfs项,这,关联到该设备的对应目录中。该目录为 [root@localhost ~]# ls -l /sys/class/net总计 0drwxr-xr-x 3 root root 0 10-08

2012-10-09 00:58:50 2016

原创 linux内核学习之网络篇——IP和TCP结构体源码

今天只是看一下IP协议的结构体和TCP的结构体所控制的字段。首先看一下IP的字段,就是传说中ip协议中的包头字段。 struct iphdr {#if defined(__LITTLE_ENDIAN_BITFIELD) __u8 ihl:4, version:4;#elif defined (__BIG_ENDIAN_BITFIELD) __u8 version:4,

2012-09-30 01:03:17 5032 1

原创 linux内核学习之网络篇——套接字缓冲区

在内核分析网络分组时,底层协议的数据将传输到跟高的层。而发送数据的时候顺序是相反的。每一层都是通过加(首部+净荷)传向跟底层,直至最终发送。这些操作决定了网络的的性能。就如下图所示 linux因此设计了一个结构体 如下代码/** * struct sk_buff - socket buffer * @next: Next buffer in list * @

2012-09-29 01:00:14 4162

原创 linux内核学习之网络篇——通过socket通信

通过网卡,让我们能达到通信,对unix是相当的复杂,组要是socket每一层都是用了不同的通信协议,需要好多设置好多的选项。因此在/dev目录下,并没有网卡对应的文件。 socket不仅可以用于各种传输协议的IP的连接。也可以用于内核支持的所有其他地址和协议类型。套接字是使用socket库函数生成的。然后bind函数等。socket主要用于协议的选择,通信类型,地址族。bind

2012-09-26 23:40:31 5130 1

原创 linux内核学习之网络篇——TCP/IP概述

1.ISO 参考模型因特网协议栈中的层人们已经进行了一些讨论关于如何将TCP/IP参考模型映射到到OSI模型。由于TCP/IP和OSI模型组不能精确地匹配,还没有一个完全正确的答案。另外,OSI模型下层还不具备能够真正占据真正层的位置的能力;在传输层和网络层之间还需要另外一个层(网络互连层)。特定网络类型专用的一些协议应该运行在网络层上,但是却运行在基本的硬件帧交换上。类似协议的例子有

2012-09-26 21:20:02 2593 2

原创 Linux 下C语言简单实现线程池

C语言简单实现线程池0 前言网上关于线程池的例子还是不少,简单明了的倒是比较少,看了网上的资料,打算借鉴网上的一些例子,自己实现以下。线程的概念就不多说,首先说一下多线程的好处:多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。那么为什么又需要线程池呢?我们知道应用程序创建一个对象,然后销毁对象是很耗费资源的

2012-06-16 16:30:17 13177 10

原创 分享一下工作以来我看过计算机书籍

由于自工作依赖一直专注于linux 下的c/c++编程工作,所以,我的书籍也大的都是这方这边书尽管很经典,但是我的能力实在有限,只把数据结构的那点看了一下,其他的 看的很吃力,所以放下了,没怎么,希望将来我能力上来了,再看吧。这是一本好书。让你知道c++到底给你做了那些事情,编译器为你生成了那些代码,是什么影响了C++的效率。c++的一些实现机制,表达的很好,还有一些例子,争取

2012-06-03 13:10:00 15163 75

原创 Ngnix 源码学习(3)----内存池结构

本篇首先把 内存池结构 大概的说一下,具体使用将在下一节细致描述 首先知道内存池的作用     为什么需要内存池?a. 在大量的小块内存的申请和释放的时候,能更快地进行内存分配(对比malloc和free)b.减少内存碎片,防止内存泄露。 内存池的原理    内存池的原理非常简单,用申请一块较大的内存来代替N多的小内存块,当有需要malloc一块比较小的内存是,

2012-04-08 21:30:54 2825

原创 ngnix 源代码学习(1)

一直想学习一个优秀的服务器源代码,之前一直纠结在学apache还是ngnix,后来比较一下,还是学习ngnix比较好,因为我目前致力于linux下的服务端软件开发。尤其是想学一下web服务器的开发。 第一,代码量比较少,貌似就十万行,但是apach几十万行,会很累看的。第二,技术都比较好,代码风格好。第三,技术文档少,刺激自己努力学习第四,目前很优秀的web服务器。

2012-04-04 23:40:28 2981 1

原创 多线程实现消费者生产者的例子

今天看书,看了一个例子,于是自己手动的自己敲了一下。。。但是,期望的结果和理论结果是不一样的,求解答啊。。。上源代ma#include "apue.h"#include /* basic system data types */#include /* timeval{} for select() */#include

2012-02-04 21:30:53 2350 2

原创 dynamic_cast, reinterpret_cast, static_cast and const_cast 学习

dynamic_cast, reinterpret_cast, static_cast andconst_cast在C语言中,经常会遇到类型转换的一些东西。类型转换分为:显示类型转换和隐式类型转换。隐式类型转换:所谓隐式类型转换就是语言本身,使用编译器,自动就给我们转成了我们需要的类型比如如下代码:short a=2000;int b;b=a;但是要主要一点,

2012-01-31 10:40:51 1571

原创 POSIX---linux多线程编程基础入门。

过年不回家了,一直在工作的地方呆着,就腾出了很多时间来学习了。前几天腾讯给打电话,问了linux下的一些知识,但是答得很不好。自我分析了一下,总结如下:1.知识学习一遍是远远不够的。还是要多学习,多揣摩,多思考。2.知识是要经常回头复习的。3.程序的工作是要多自己写代码实践,多思考。写出自己的东西。好,开始学习linux了。《线程》,对于一个程序员,如果不懂得线程,那么我觉得他

2012-01-21 00:12:33 5324 1

The Swift Programming Language

The Swift Programming Language The Swift Programming Language The Swift Programming Language 新语言大家值得学习

2014-06-05

标准库boost程序库导论(中文版).chm

标准库boost程序库导论(中文版).chm标准库boost程序库导论(中文版).chm标准库boost程序库导论(中文版).chm

2011-08-23

C++ static 用法总结

C++ static 用法总结C++ static 用法总结

2011-08-23

关于c++ 继承多态的深度思考

c++ 继承多态 深度思考c++ 继承多态 深度思考c++ 继承多态 深度思考c++ 继承多态 深度思考

2011-08-23

毕业论文(设计)排版模式

毕业论文(设计)排版模式 毕业论文(设计)排版模式 毕业论文(设计)排版模式

2011-07-20

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除