- 博客(68)
- 资源 (4)
- 收藏
- 关注
原创 使用node-addon-api编写c/c++扩展(传递复杂对象)
本文提供了在使用node-addon-api编写c/c++扩展时,由js向c++传递复杂类型时遇到的各种情况。其他基础知识就不赘述了,这篇文章讲的不错,不熟悉Node.js编写扩展的同学可以了解下。官方给出了很多简单的例子以供参考,但是这些例子仍旧偏少,缺少各种用法示例。我相信各位能找到这篇文章八成是遇到了传参问题。js如何向c++传递二维数组?这里给出关键代码,最主要的是参数类型的转化。由...
2019-03-22 11:14:07 3091 1
原创 使用mocha编写pomelo项目的单元测试
怎么安装就略去了,这个比较简单。使用方法也比较简单,网上教程也比较多。这也只是总结下自己写单元测试时遇到的问题。 刚开始写单元测试时,出现了比较奇怪的问题,总是达不到自己想要的效果。根源还是对于mocha的执行时序的不了解。这里总结了下执行时序的资料如下:describe里地时序simple casedescribe('work',function(){
2015-05-20 15:39:24 1878
原创 使用extjs的mvc架构开发简单的站点
首先弄清楚extjs和ejs的区别在哪?ejs只是一个javascript的模版库(模版引擎),用于从json数据中生成HTML字符串;而extjs则是一个使用javascript编写的,前端ajax框架。Extjs的MVC,其中model,store为数据层,controller为控制层,也是聚合器,grid、tree为视图层(view),.官方的意思就是要把将数据层、视图层在con
2015-05-18 11:13:22 1038
原创 数据链路层组播报文接收问题
接口默认是不接收数据链路多播报文的。。这里要设置接口的ifr_flags标识下面是设置ifr_flags的程序#include #include #include #include int main(int argc,char* argv[]){struct ifreq ifr;int sockfd;sockfd = sock
2015-04-30 17:42:23 1585
原创 node的async流程控制包parallel的实现
Async介绍 Async是一个流程控制工具包,提供了直接而强大的异步功能。基于Javascript为Node.js设计,同时也可以直接在浏览器中使用。 Async提供了大约20个函数,包括常用的map, reduce, filter, forEach 等,异步流程控制模式包括,串行(series),并行(parallel),瀑布(waterfall)等。 项目地址:htt
2015-04-17 18:03:46 3625 1
原创 FFXI-darkstar源码阅读
Darkstar是最终幻想11的开源模拟服务器,项目托管于github平台:地址https://github.com/DarkstarProject/darkstar。相比wow的开源服务器源码,总体上来讲代码实现还是比较简单的,适合入门。 darkStar总共有三个进程,分别对应查找服务器,登录服务器和地图服务器。darkStar是FFXI最终幻想11的模拟服务器,它的游戏逻辑主要采用
2015-04-17 15:07:38 1559
原创 pomelo的rpc实现原理
先从客户端这边说起。当服务器启动之后,会收到addServers消息(即后启动的服务器发来的消息)。 看看proxy.js中的收到addServers后的处理:pro.addServers = function(servers) { if (!servers || !servers.length) { return; } genProxie
2015-04-14 19:00:24 2737
转载 网游服务器端设计思考:心跳设计
原帖:http://blog.csdn.net/pbymw8iwm/article/details/8471280网络游戏服务器的主要作用是模拟整个游戏世界,客户端用过网络连接把一些信息数据发给服务器,在操作合法的情况下,更新服务器上该客户端对应的player实体、所在场景等,并把这些操作及其影响广播出去。让别的客户端能显示这些操作。 在这个模拟过程中,需要解决的一个重要
2015-04-13 10:36:03 1139
原创 网络游戏的同步问题
最近是看到知乎上的关于网络游戏位置同步问题的讨论?整理了下资料,总结如下: 在实时网络游戏中,如何尽可能的做到玩家位置的同步?可以参考一下文章:http://www.zhihu.com/question/29076648http://blog.codingnow.com/2006/04/sync.htmlhttp://www.skywind.me/blog/archives
2015-04-11 16:48:07 2619
转载 C++中使用Lua脚本 和lua中调用c的方法
原地址:http://www.cppblog.com/jack-wang/archive/2011/09/29/157115.html第1步:下载从官方主页www.lua.org下载Lua源代码,最新版本为5.1.3。(jack-wang注:现在已经是5.1.4了)解压之后找到“[Lua]/src”文件夹,这里面就是Lua了,不过还不能直接使用。第2步:
2015-04-11 15:13:30 645
原创 pomelo服务器群消息变更的获知
Pomelo中是master服务器首先启动,然后在启动其他服务器的。那么当一个服务器启动时,它是如何获知此时整个服务器集群整体信息的?当服务器启动之后,后续服务器的添加或删除的信息是如何传递给该服务器的呢? 首先,当master服务器启动时,会创建masterAgent。Pomelo-admin中的consoleService.js中:var ConsoleService
2015-03-16 09:43:34 1906
原创 游戏buff的设计
看到云风大神的一篇文章,讲到了游戏buff的设计。最主要的一点就是要考虑特殊情况下的,buff可逆运算的正确性。使用base+offset的方式去实现避免某些buff不可逆的漏洞。http://blog.codingnow.com/2007/11/inertia_thinking.html
2015-03-11 12:32:26 1932
原创 任务目标配置格式的设计
一般的游戏会设计任务系统。当玩家完成指定的任务目标之后,就可以领取任务奖励了。通常各种任务目标会依赖于游戏其他的系统,比如完成竞技场挑战5次,这样的任务目标就与竞技系统相关联了。 这样在我们给任务系统制定配置文件格式时,就比较头疼了。应为各种类型的任务目标是没法统一的抽象为简单的格式。 比如:现有任务目标A,B, C 它们各种的任务目标相关字段:A需要v1, v3,
2015-03-11 12:29:34 1056
原创 pomelo服务器启动过程2
在pomelo服务器启动过程 一文中,知道了master服务器是如何启动其他服务器的。那么在最初开始app.start是启动过程又是如何的呢? 可以看看app.start的函数实现: Application.start = function(cb) { this.startTime = Date.now(); if(this.state > STATE_INITED) {
2015-01-05 16:46:23 1672
原创 提取plist文件中的单图或分解plist大图为小图
一般来讲如果你看到了某个界面比较炫的app,肯定会想把它的界面资源拿来用用。将apk包解压之后,总会发现它将一些小图拼成了一个大图,一般就是生产了两个文件:plist文件和png文件。这个时候你想使用其中的某个小图,还得自己用ps从来里面抠图,这样实现太麻烦了。那么能不能使用脚本来替我们完成任务呢? 网上找了找,这个http://blog.csdn.net/linuxchen/artic
2014-11-24 15:37:04 15455 2
原创 使用c++简单实现reactor模式
事件驱动模型广泛地应用于高性能的web服务器中。而相对应的事件处理模式,最为典型的就是Reactor模式(中文可以称作“反应器” “反应堆”等等,各种叫法都不一样,估且就使用英文吧,叫它Reactor模式)和Proactor模式(中文也称“主动器” “前摄器”,同前者一样称其为Proactor模式)。其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作。在各种书籍上,能
2014-11-22 09:29:56 11925
原创 node中javascript调用c++实现过程分析
先做这样的约定,node提供的模块,称为核心模块。用户编写的模块,称为文件模块。Node中那些由纯c/c++编写的模块称为内建模块。Node中buffer crypto evals fs os 等都是部分通过c/c++编写的。内建模块内部的数据结构
2014-10-21 10:59:03 1365
原创 libuv异步实现分析
我们都知道libuv是异步非阻塞的,那么它究竟是如何实现异步的呢?Libuv中文编程指南上如是说libuv提供的文件操作和 socket operations 并不相同.套接字操作使用了操作系统本身提供了非阻塞操作,而文件操作内部使用了阻塞函数,但是 libuv是在线程池中调用这些函数,并在应用程序需要交互时通知在事件循环中注册的监视器.参考:http://www.
2014-10-15 17:27:26 4320
原创 libuv概览
libuv 的API是C风格的,很容易读。你可能觉得uv.h中暴露了太多的数据结构了,不够简洁,我想是因为libuv涵盖的内容非常的广泛,从网络,pipe,文件,终端等等,包罗万象。而且uv.h也不是接口的全部,还有两个头文件,uv-unix.h和uv-win.h,里面定义了操作系统specific的数据结构。其实,libuv已经对接口的简化做了一些努力,比如说,通过uv_write一个函数,我们
2014-10-15 17:24:47 1780
原创 libuv中关于linux-syscalls和linux-inotify模块
Linux-syscalls这个模块主要是定义了一些系统调用和一些常量,这样做主要是为了弥补一些较旧的glibc没有提供比如inotify等等头文件的缺点。当然它不会去实现这些系统调用。从代码上看,它屏蔽了不同的cpu架构,对外提供统一的接口。这些接口,有套接字相关的、epoll相关的、inotify相关、读写相关、管道相关等等。系统调用接口
2014-10-15 15:36:10 1511
原创 pomelo启动过程
首先 master.js中的Start->[consoleservice.js的start函数]->[moduleUtil.js的startmodules函数]—>[starter.js的runservers函数]然后在runservers中通读取配置文件,再通过run函数逐个启动服务器。两种方式localrun 或 sshrun starter.jsconsoleservice.
2014-10-13 14:57:39 1937
原创 Pomelo中session创建和connection连接过程分析
首先,来看pomelo中,那么组建是如何被载入的。在pomelo.js中,看如下代码:
2014-10-10 17:44:35 6335 1
原创 nodejs单线程、异步事件的理解
都说nodejs是单线程,异步非阻塞了,不了解的人总会犯迷糊——它既是单线程的,如何又是异步的呢?这里需要知道的是,通常我们所写的代码都是在单线程中执行的,但是nodejs自身却不是单线程的。 上图为nodejs处理模型,可以看到EventLoop自身是单线程的,它将一些费时的操作扔个了另外的线程,在处理完后通过回调返回给EventLoop线程。还有一点就是EventLoop线
2014-09-25 15:51:03 3636
原创 这里实现一个基于数组的线程安全的循环队列
具体代码如下:#include#includeusing namespace std;#define QUEUESIZE 128templateclass ThreadSafeQueue{private: pthread_mutex_t m_lock; int m_front; int m_rear; object m_data[QUEUESIZE];public:
2014-07-30 23:32:13 2497 3
原创 这里实现定界加锁线程安全的单例模式
具体实现代码为:#include#includeclass CLockGuard{public: CLockGuard(pthread_mutex_t* lock):m_LGLock(lock),owner(false) { GetLock(m_LGLock); } void GetLock(pthread_mutex_t* lock) { pthread_mut
2014-07-28 23:32:17 796
原创 为什么宏定义总是要使用do-while语句呢?
在阅读linux内核代码的过程中,经常会发现宏定义中使用了do-while语句。有时候觉得这种do-while语句显得有点多余?干嘛非得使用它把函数块包裹起来?像下面的#define MARCO_FUN1() do{\ Function();
2014-06-30 23:13:49 3008 2
原创 STL迭代器与类型萃取器
什么是迭代器iterators,迭代器就类似于原生指针,比如char* p。它最重要的便是内容提领和成员访问。通过迭代器能够依次序巡访某个容器中的各个元素,但是又无需暴漏该容器的内部表述方式。考虑字符型指针p,我们可以通过指针的移动来访问到字符串中的各个元素。迭代器就类似于原生指针,但是其实现却是以类的方式来实现的。 STL对每一个迭代器都提供了专属的迭代器。 迭代
2014-04-30 16:37:07 1068
转载 二进制与三进制在it笔试面试中的妙用
先来思考几个问题,并不难,各位大牛应能秒杀:1. 小明是个卖苹果的,小红一次在小明那买N(N2. 有16种溶液,其中有且只有一种是有毒的,这种有毒的溶液与另一种试剂A混合会变色,而其他无毒溶液与A混合不会变色。已知一次实验需要1小时,由于一次混合反应需要使用1个试管,问最少使用多少个试管可以在1小时内识别出有毒溶液?3. 27个小球。其中
2014-04-22 10:09:49 1486
原创 求最大子段和
求最大子段和的扫描算法中,并不能成立数组中元素全为负数的情况。这里要进行单独处理,我们可以将负数的处理判断和for循环放在一起进行处理,提高效率。
2014-04-19 10:09:45 794
原创 给你一个字符串,把连续出现的相同字符串变成只出现一次
题目:给你一个字符串,把连续出现的相同字符串变成只出现一次。比如:aaabbccc解析思路:
2014-04-17 19:28:51 3007
原创 python中整数的缓存机制
在python中,如下代码结果一定不会让你吃惊:Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:06:53) [MSC v.1600 64 bit (AMD64)] on win32Type "copyright", "credits" or "license()" for more information.>>> a=345>>>
2014-03-28 21:07:12 4180
原创 找出1-100中缺失的两个数
题目:有一个数组 int array[100];本来应该存放的数为1~100,但是有两个数据a,b丢失了,值变成了0。问如何找出丢失的那两个数?附带条件不能开辟额外的空间。解题思路:常见的两种解法有:1.计算a+b和a*b的值,然后在解方程求解(但是这样会使得中间某个变量过大)。2.使用bit位来标记。占用13个字节。第二种方法使用了额外空间,第一种可能会造成整型溢出。这里考虑转化为熟悉的方法
2014-03-25 20:50:22 7192
原创 rstp设备之间的对接
项目需要将自己开发的运行rstp的设备和moxa交换机对接。在实际对接过程中,发现收敛速度提不上来。具体表现出来的就是两种设备P/A协商不成功。后来抓包发现,我们自己实现的rstp协议将在收到bpdu时,这样设置bpdu.role:switch ((buf[7] & 0x0c) >> 2){ case 1: p->bpdu.role = BR_BPDU_ROLE_ROOT;
2014-03-25 19:43:30 1325
原创 linux内核线程cpu占用100%?!
在项目中遇到内核线程占用几乎100%的现象,而且内核模块不可卸载。在查找资料之后,一个可行的模板如下:#include #include #include #include #include #include #include #include #include // for DECLARE_COMPLETION()#include
2014-03-20 16:05:31 4808
原创 udp的close系统调用
在印象中,是只有tcp才需要调用close来关闭套接字描述符的,而udp需要与否是无关紧要的。这种直接的印象源于tcp是一个面向连接的协议,而udp则不是。因此对于一条连接,我们需要将其关闭而没有连接的则不需要。而事实并非如此。 就刚不久之前,项目遇到了这样的一个问题:在一个多次循环中,每次循环都会创建一个udp的无连接的套接字,但是循环结束时却没有调用close来关闭这个套接字描述符
2014-03-17 20:00:17 3700
原创 linux服务器编程初步
若对服务器进行分类,如果按照对于事件处理机制来分,则可以划分为迭代服务器和并发服务器。 所谓的迭代服务器是指在完成对当前客户的服务之前无法处理已等待服务的新客户,即是串行为客户服务的。而并发服务器则是并发地同时地为多个客户提供服务。 本文实现两个最初级版本的两种服务器。首先介绍客户端/* Author: time:2014/02/24 func:i
2014-02-25 09:28:51 868
原创 openlldp-0.4alpha实现详解(七)——lldp_main,lldpneighbors模块
lldp_main.c模块调用之前的各个模块的接口,实现lldp功能。使用select进行套接字的复用,每个一秒运行一次端口发送和接收状态机。#ifdef BUILD_SERVICE// We are building as a service, so this should be our ServiceMain()int ServiceMain(int argc, char *arg
2014-02-24 11:10:47 3503 1
原创 openlldp-0.4alpha实现详解(六)——lldp_tlv、lldp_tlv_common、msap、lldp_neighbor模块
lldp_tlv主要是用来创建各种lldp报文所需的tlv,并提供验证。而lldp_tlv_common模块则是对于标准tlv进行修整。之前我们知道,lldp的tlv的type只有7个bit位,而length则有9个bit位,这样的结构对于程序的使用是十分不便的,故此进行转化。将7个bit位的type,转化为uint8_t。9bit的length转为为uint16_t的。 msa
2014-02-24 11:07:01 2536 1
调试好的简单聊天程序
2008-12-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人