自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

专注于网络编程,游戏后台,高并发

天天积累,天天成长,喜欢开源 https://github.com/shonm520

  • 博客(156)
  • 资源 (3)
  • 收藏
  • 关注

转载 从文件 I/O 看 Linux 的虚拟文件系统

1 引言Linux 中允许众多不同的文件系统共存,如 ext2, ext3, vfat 等。通过使用同一套文件 I/O 系统 调用即可对 Linux 中的任意文件进行操作而无需考虑其所在的具体文件系统格式;更进一步,对文件的 操作可以跨文件系统而执行。如图 1 所示,我们可以使用 cp 命令从 vfat 文件系统格式的硬盘拷贝数据到 ext3 文件系统格式的硬盘;而这样的操作涉及到两个不同的文...

2019-07-31 12:56:36 383

原创 C++11 lambda函数

用过脚本语言的童鞋都知道,函数的定义可以在任何地方,例如:local function table_sort(t) local function sort_by_len(t1, t2) return #t1 < #t2 end table.sort(t, sort_by_len) --上面的代码也可以简写为:...

2019-06-14 15:34:35 2039 2

原创 最简makefile教程(二)

上篇讲解了makefile的基础知识,这篇介绍点更有意思的,能够大幅度提高编写编译指令效率的方法。有这样一个需求,先将文件下的所有c文件编译,然后链接成可执行文件。你不会要我写如下的代码吧:app: a.o b.o c.o .... gcc -o app a.o b.o c.oa.o : a.c gcc -c -o a.o a.cb.o : b.c gcc...

2019-06-12 21:53:00 469

转载 32位与64位下各类型长度对比

4 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件大小最大达到4 EB(2 的 63 次幂);可以访问大型数据库。本文介绍的是64位下C语言开发程序注意事项。1. 32 位和 64 位C数据类型32和64位C语言内置数据类型,如下表所示:上表中第一行的大写字母和数字含义如下所示:I表示:int类型L表示:long类型P表示:pointer指针类型32表示:32...

2019-06-01 12:42:42 352

原创 最简makefile教程(一)

一直对makefile文件一知半解,今天好好研究了一下他的用法。研究过后,发现其实makefile语法很简单,核心思想就是执行对应的指令而已,为了叙述方便先从最简单的指令讲起。例如:A : cmd aB : C D cmd bC : cmd cD : cmd d #注意cmd前面必须要有tab键你可以把A,B看作是一个指令标签,也...

2019-05-31 19:21:26 516

原创 资料速查

一 工具类:1 在线编译https://c.runoob.com2 git操作1) 分支对比https://blog.csdn.net/u011240877/article/details/525866642) 合并指定commit到分支https://blog.csdn.net/ybdesire/article/details/421455973) git...

2019-05-31 17:10:23 207

原创 自己写http服务器

为了从性能和易用性上测试我写的mu_event的效果,想写一个网络应用来验证一下,正好我的下一个目标是http服务器,所以我决定动手写一个小型的http服务器。其实开源的http服务器有很多,但是出名的都是比较重量级的,不利于学习。所以我找了几个小型的http server项目,抽出其中的http协议解析部分,改动部分代码后,应用在我的项目中使用。我本以为很快就能完成一个基本的项目,后来却...

2019-05-25 15:46:56 1205

原创 用web展示skynet服务详情

之前看到有群友用web来展示skynet服务的详细信息,其实原理很简单,利用skynet自身提供的调试接口即可。最近又在练手写一个web服务器,正好顺道一起实现了。当然目前我这个web器还不能充当一个强大得出web后台,正好我学了点flask,所以后台用flask来实现了,而且用Python处理数据也非常得心应手。对于web前端,我非常缺乏这方面的知识,且内心里面渴望学好前端,因为用前端可以不费劲...

2019-05-17 18:11:21 862

转载 详解Docker挂载本地目录及实现文件共享

docker挂载本地目录的方法总结Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定。譬如我要启动一个centos容器,宿主机的/test目录挂载到容器的/soft目录,可通过以下方式指定:# docker run -it -v /test:/soft centos /bin/bash这样在容器启动后,容器内会自动创建/soft的目录。通过这种方式,我们可以...

2019-04-25 18:12:56 276

原创 skynet.newservice的实现简析

使用过skynet的童鞋都知道,一般新启动一个服务是调用skynet.newservice函数。至于他的代码实现,相信没有多少人会去看,这篇文章会讲明白为什么skynet.newservice要这么实现。刚开始的时候,我以为sky.newservice只是启动了一个参数是lua文件名的snlua服务,例如skynet.newservice('room'),我天真的认为他的实现如下:loc...

2019-04-17 16:38:00 4346

原创 skynet 简单的消息执行流程情景分析

skynet.lua对比以前优化了一些函数,尤其是对协程的控制,使得消息的处理流程更加清晰。我们现在来一步步剖析这个消息执行流程,加深对skynet reactor模式的理解以及协程的应用。首先看服务的第一条消息是怎么产生,又是如何被处理的。在创建一个snlua服务后第一条消息靠什么来驱动呢?答案是靠自己(第一步还是得靠自己,然后别人才有机会接触你),看看下面的代码可以清楚的看到:int...

2019-04-17 12:47:01 2049

原创 skynet答疑一 --skynet.start参数为什么要在定时器中执行

有人在群里问到为什么skynet.start函数的参数为要在一个定时器中执行,不能直接执行吗?skynet.start函数如下:function skynet.start(start_func) c.callback(skynet.dispatch_message) skynet.timeout(0, function() skynet.init_servic...

2019-04-13 23:31:22 936 1

原创 自己写一个网络库的心得

总是在看网络相关的代码,还没有完整的实现过一个网络库。南宋大诗人陆游有云,纸上得来终觉浅,绝知此事要躬行。哈哈这也是我们高中的校训之一。这两周抽了点时间实现了一个小型的网络库,深度参考了muduo,只不过我是用C语言实现的,名字就叫muevent。muduo是用C++的,我为什么要用C语言呢,而且我曾经用C++的时间要远多于C。因为C语言更加接近底层实现,C++干了太多不为人知的事,毕竟...

2019-04-12 19:50:48 1921

原创 skynet socket.lua 读写缓冲区剖析

这两天剖析了一下socket.lua,整体不是很难,主要是数据缓冲区的实现需要好好分析一下。这里读写数据也是用到了缓冲池的思想,为了更加直观的说明代码,还有方便测试,我去掉lua代码,把核心接口直接用C++实现了一遍:#include <stdio.h>#include <string.h>#include <vector>using std::...

2019-03-19 22:40:19 1607

原创 lua面向对象生成实例的正确方式

写lua这么久了,也知道怎么样用lua来实现所谓的面向对象。下面这段代码是我常用来new一个新实例对象的:local Object = {a = 123}function Object:new (data) local data = data or {} setmetatable(data, {__index = self}) return data ...

2019-03-06 22:39:21 1088

原创 lua代码优化

前几天写代码lua时,由于涉及到大量的数值逻辑计算,所以性能至关重要。经过一番研究和调试,总结了如下提高lua代码执行效率的方法:使用缓存这个不论是在lua,在任何语言的程序中都适用,脚本语言显得尤为突出。使用缓存来优化,提高程序性能是一个很大的主题,这里不再详细论述。只需记得,当使用重复数据(或有重叠)时一定要缓存起来,以供后面使用,而不是每次都重新计算,这样会大大提高效率,尤其是涉及到繁...

2019-03-06 15:23:50 2356 2

原创 skynet lua与c交互相关函数

我们都知道skynet底层是用c实现的,逻辑层用lua实现。那么c底层是怎么样与lua层实现交互的呢?这篇文章将会讲解这方面的内容。系列文章中的skynet怎么启动lua文件讲到了skynet是如何启动lua代码的,无非是调用lua api加载lua文件。有个QQ群友问到c底层究竟是如何调用到lua层的回调函数的,正好这篇文章会分析这个。加载我们的lua逻辑文件后,一般lua 服务都会有一...

2019-02-28 14:52:50 1383 2

原创 skynet 服务的名字

skynet服务的名字我们在开发过程中会使用到,这篇文章试着讲解一下skynet服务名字的有关内容。首先每个服务在初始化的时候都会调用skynet_command(ctx, "REG", ...)。例如snlua服务调用了skynet_command(ctx, "REG", NULL),logger服务调用skynet_command(ctx, "REG", ".logger"),最终会调用到...

2019-02-26 14:54:05 1372

原创 STL内存管理

这些天在看内存的分配管理的知识,可以参考前面写的文章:linux内存分配管理实现自己的malloc STL是一套非常高效的C++库,提到内存管理,怎么能少了他呢,花了近一天的时间来剖析这个。STL内存分配分为两级,为什么分为两级,就比如你为了买一根普通的皮带,去汉正街批发市场,别人不一定卖给你(亲身经历)。只有一次性购买大量的货才会去批发市场,商家才会和你做生意。内存分配也是这...

2019-01-25 14:43:16 869 2

原创 实现自己的malloc

按照上篇文章的思路,自己实现的一个简单malloc:#include &lt;unistd.h&gt;#include &lt;stdio.h&gt;struct header_t { size_t size; //8B unsigned is_free; //4B struct header_t* next; ...

2019-01-19 20:57:58 1146 2

原创 linux内存分配管理

本打算尽快完善一下mlua的gc,按照我学习的思路,如果对一块东西底层的原理或者他的来龙去脉都不清楚的话,是很难透彻理解相关东西的。对于gc我们就要搞清楚程序的内存是如何被分配,又是如何被释放的,对应的底层又是怎么实现的。说实话,在这之前我对这些都是很模糊的,动态分配内存用C++只会new delete,用C语言只会malloc和free,根本没有关心他们底层的原理和实现,趁这个机会好好的学习一下...

2019-01-19 20:11:02 864

原创 脚本语言的面向对象(二) 类继承的实现

上篇说到,类与类实例的关系是索引关系。实现类继承时,也是基于索引的。例如下面的例子:class Fa: def __init__(self) self.fa_data = xxx def fun_in_Fa(self): pass class Son(Fa): def __init__(self) self.s...

2018-12-21 19:46:34 364 1

原创 脚本语言的面向对象(一)类与类实例的关系

脚本语言诸如python,lua的面向对象与静态语言诸如C++的面向对象本质上有很大的区别。拿python和C++举例,C++中定义了一个类class,例如:class Objpublic: int data; void mem_func(){};这里只是声明了一个类的,定义了类的属性和函数。在创建类的对象之前,也就是调用o = Obj()实例化一个对象之前,进程...

2018-12-19 20:34:07 589

原创 用python写逻辑的感受

最近工作用python写游戏逻辑,用惯了用lua写脚本,发现还是有一些地方不一样。虽然早就学了python语言,也经常用python写一些辅助工具,真正在工作的线上代码使用还是第一次。毕竟python也是脚本语言,我自己也实现过脚本语言,脚本语言的优势和便捷性在python语言中体现的淋漓尽致。下面说说用python写游戏逻辑的体会,主要对比以前写lua脚本时的感受。python语言使用局部变...

2018-12-18 23:47:13 1402

原创 go 并发控制

go语言天生支持高并发,同时访问几千几万网页不是问题。例如在写网络爬虫时,我们从根页面找出其他的页面,然后其他的页面又找出其他的页面,如此反复。虽然go可以支持同时访问那么多页面,但是操作系统却不支持同时打开那么多页面,因为每次访问页面都是一次socket通信。每次socket通信就会占用文件描述符fd,操作系统同时支持打开的fd是有限制的。所以有必要做并发控制。下面模拟爬虫的实验。有一个函数...

2018-11-11 19:47:21 861

原创 google protobuf 反射的例子

反射就是可以知道一个对象自身的数据属性,例如有哪些字段,字段的值,函数等等。下面的代码展示了protobuf 对象反射的例子。将一个对象按照反射的字段顺序序列化到string,然后反序列化到对象。最后调用反射打印其字段值,可以看到对象能够还原。proto文件为(暂时不支持数组):package tutorial;message Person { required string ...

2018-11-10 17:02:27 367

原创 google protobuf 序列化,反序列化例子

proto文件为:package tutorial;message Person { required string name = 1; required int32 id = 2; optional string email = 3; } 用四种方式简单的展示了protobuf序列化和反序列化的例子:#include &lt;iostream&gt;#i...

2018-11-07 21:57:20 1151

原创 golang 包的管理

以前看golang包管理时,感觉有点混乱,套用python,lua包管理的方式不行,直到今天(2018.10.19)才基本搞清楚golang包管理的意思。使用包package目的使用包的目的是为了更加方便的管理源码。golang的理念是用文件夹来管理(或者叫约束)同种类型或同种功能的源码,例如数学计算的源码都放入math文件夹下,系统相关的放入os文件夹下。一个文件夹下的源码中所有包名...

2018-10-19 18:42:05 934

原创 c struct结构体分段

看代码中发现了一段一时间能理解(N年的老司机猜也能猜到了)但是又不太确定的代码:union SID { SID(uint32_t sid) : sid_(sid) {} struct { uint32_t game_id_:16; uint32_t role_idx_:16; }; uint32_t sid_;};...

2018-10-15 21:50:16 561

原创 为什么抓包时IP包会大于MTU

在linux上抓包的时候,发现了很大的包,有的包达到了2800字节,在局域网的时候甚至有10K字节以上的包。这与我们所学的IP数据包不能超过MTU(一般是1500字节)相违背。查资料得知,这是因为网卡有设置tcp-segmentation-offload。这是操作系统为了减轻负担,提高处理效率的一种方法。 我们知道,用TCP/IP协议处理网络流量,要占用大量服务器资源。为了减轻服务器的压力...

2018-09-30 14:46:22 3053

原创 boost 多索引容器multi_index_container

在游戏开发中遇到了boost的multi_index_container,中文翻译为多索引容器。那什么是多索引容器呢?为什么使用他?如何使用他?下面就一一介绍。想必大家在实际开发中一定多多少少会遇到以下的问题,我需要创建一个map,并且需要两种方式去索引,比如:创建一个&lt;学号,姓名&gt;的map,但是我既需要用学号去索引,又需要用姓名去索引,但std::map只能用它的key_type...

2018-09-26 19:27:07 1266

原创 linux 命令行解析

从windows开发转向linux开发的程序员,实际写代码过程中还是有很多不同的,第一个遇到的不同可能是linux的命令行。windows 应用开发很少有命令行,而linux命令几乎全有命令行,这是因为linux没有操作界面,只能以命令行的方式来切换程序运行不同的命令,或调节命令的参数。比方说你要统计一个文件有多少个字符,在windows下你可以直接用界面操作来选择一个文件,而在linux下你只能...

2018-09-17 19:32:54 782 1

转载 C语言变长数组data[0]【总结】

 1、前言  今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到data[0]。这样设计的目的是让数组长度是可变的,根据需要进行分配。方便操作,节省空间。2、data[0]结构经常遇到的结构形状如下:struct buffer{ int...

2018-09-09 21:00:42 272

原创 一步步写lua解释器--多参赋值的问题

有个问题倒是缠绕了很多时间,问题非常简单清晰,就是,函数的返回值取值个数的问题。例如function ft() return 13, 78 endlocal a, b, c = 3, 4, ft()print(a, b,c)a, b, c = 3, ft(), 5print(a, b,c)a, b, c = ft(), 5print(a, b,c)a, b, c = ft...

2018-08-27 00:19:38 674

原创 一步步写lua解释器--递归的bug

在网上与人讨论时,别人问我能否调用递归。这个确实还没有执行过,我也想试一试。结果一试就GG了。调试的结果是闭包内部的局部变量表push和pop的次数好像不一致,导致pop空表,然后就崩溃了。经过反复调试,还是没有找到问题,局部表的push和pop就在块开始和结束的地方,应该是没有问题的。调试是个非常复杂的过程,因为嵌套的调用非常多,一般递归里面肯定是由if语句的,而if语句又是写在块里面,逐渐...

2018-08-27 00:12:13 538

原创 一步步写lua解释器--泛型for循环

写泛型for之前,我发现连这个语法都不是太清晰,因为大都for, in 后面跟着pairs()或ipairs()函数,以为for,in后面只能是这两个函数。查看了官网资料,for, in 的语法规则是:for namelist in explist do block end 也就是说for,in后面需要一个表达式列表,但是他们必须要有一定的的规则,例如:for k,v in ip...

2018-08-27 00:03:23 714

原创 一步步写lua解释器--数值for循环

lua中for语句分为数值型for循环和泛型for循环。其中数值型for较为简单,我们先说它。数值型for循环的要点:for var=exp1,exp2,exp3 do &lt;执行体&gt; end例如:for i = 1, 2,1 do print(i)end需要特别注意的是,其中变量i是这个for循环体的局部变量,也就是说这个i在for循环外...

2018-08-26 23:56:14 454

原创 一步步写lua解释器--table的实现

lua中的table貌似是lua中唯一的数据结构了,他既可以充当数组,也可以充当map使用,把这两种结合为一个数据结构,足以说明lua的简洁易用性。原本以为table实现起来会比较复杂,结果一上午就差不多写好了,而if语句却写了一整天,当然也包括了优化其他代码。table的实现包括构造和存取。一个table的构造:local a = {b = 3,c = {e = 9}}语法树...

2018-08-26 23:49:06 588

原创 一步步写lua解释器--if else语句

if 语句可以拆成三个部分:逻辑判断部分,if 左边的部分,if右边部分,例如:if b == 1 then local c = 100 print(c)else print(2)endb==1为逻辑判断部分local c=100 print(c)为if左边部分,print(2)为右边部分如果if 没有else 则右边部分为空。对于if a ...

2018-08-26 23:25:24 927

原创 一步步写lua解释器--闭包的处理

前面说到函数执行完毕,也就是闭包退出时,会清除其作用域的局部变量。但是有个问题就是保存闭包的上值,何为上值,举个简单的例子:local f = function(a) return function() a = a + 1 return a ...

2018-08-26 22:59:35 381

windows 小游戏代码

包含,两个经典的游戏代码 俄罗斯方块 扫雷 很好的windows 编程学习资料

2010-08-04

Windows程序设计中文版.rar

学习windows编程经典的资料! 原 作 者:Charles Petzold 译 者:余孟学

2010-08-04

空空如也

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

TA关注的人

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