skynet sproto 问题】的更多相关文章

刚碰到一个小细节,纠结了半个小时 sproto的协议,request 和{ 必须有空格…
云风在skynet中继承了sproto的传输协议,对比protobuf的好处是,能明文看到传输内容,而且skynet不需要protobuf这么功能,所以云风也建议在lua层使用sproto来作为skynet的传输协议. 在examples文件夹中的agent.lua中有用到sproto的例子.下面讲解一下sproto的使用过程和原理: proto.lua的文件中包含一个实例协议: local sprotoparser = require "sprotoparser" local pro…
稍后填坑 bson.so  client.so  lpeg.so  md5.so  skynet.so  sproto.so gate.so  harbor.so  logger.so  snlua.so 十个so的功能简介…
https://github.com/sanikoyes/skynet.git Skynet Skynet is a lightweight online game framework, and it can be used in many other fields. 前言 本仓库skynet支持windows下运行,只支持visual studio 2013,请确认你的编译器已经打好SP4补丁 因为很重要,所以强调一遍,请给你的vs2013打上SP4补丁,否则会编译出错. 此版本修改自官方版s…
error: ./skynet/lualib/skynet.lua:534: ./skynet/lualib/skynet.lua:156: ./logic/gate/socket_msg.lua:50:unpack_header: ./logic/gate/socket_msg.lua:41: attempt to get length of a nil value(upvalue'msg') 这个问题一般是客户端传上来的协议的id错误,导致服务端的proto_map无法获取相关协议. err…
引言: 在我看来,消息和任务调度应该是skynet的核心,整个skynet框架的核心其实就是一个消息管理系统.在skynet中可以把每个功能都当做一个服务,整个skynet工程在执行过程中会创建很多个服务,每个服务相当于一个 Actor ,是互不依赖并行执行的,但同时也存在服务之间的通信和彼此的任务调用,接下来我们就来看一下skynet中服务之间进行通信的机制. 内容概述: 接下来的内容主要围绕一下几点展开: 1.消息的分类 2.消息队列的结构(全局消息队列和服务消息队列) 3.消息队列的操作(…
阅读云大的博客以及网上关于 skynet 的文章,总是会谈服务与消息.不怎么看得懂代码,光读这些文字真的很空洞,不明白说啥.网络的力量是伟大的,相信总能找到一些解决自己疑惑的文章.然后找到了这篇讲解 skynet 消息队列的文章(最新的 skynet 消息队列代码已经有更新,变得更简洁易读).了解了 skynet 消息是如何派发的,就想知道消息被派发出去到一个服务后,如何调用服务的 callback 函数,从而处理此消息.碰巧博主写了这篇讲解 skynet 如何注册回调函数的文章,于是 skyn…
我从开源项目(https://github.com/lipp/lua-websockets,这里我们简称LWS)中抽出了websocket的部分处理,步骤如下: 1)首先是解决LWS的几个依赖问题.LWS在握手阶段的base64编解码使用了luasocket中的mime,因此在3rd文件夹中建立mime文件夹,将mime.h和mime.c文件放进去,修改skynet的Makefile文件,作为一个单独的动态库编译: LUA_CLIB = skynet \ client \ bson md5 sp…
小伙伴需要64位整数做物品的id,之前python sproto的判断有问题,写篇日志记录一下. 之前有问题的代码是这样的: if (!PyInt_Check(data)) { PyErr_SetObject(SprotoError, PyString_FromFormat("type mismatch, tag:%s, expected int", tagname)); ; } long i = PyInt_AsLong(data); ; || vh == -) { *(uint32…
这是sproto系列文章的第三篇,可以参考前面的<为sproto添加python绑定>.<为python-sproto添加map支持>. sproto是云风设计的序列化协议,用于高效的打包解包游戏协议数据.有点类似Google推出的protobuf,但是比protobuf要快.结构上有点类似cap'n Proto,但是没有打算直接使用其作为内存组织结构,因此少了数据对齐的部分.目前使用场景主要是在游戏客户端和服务器端的RPC协议上. sproto比较有趣的一点,是可以自描述,用sp…
项目地址:https://github.com/spin6lock/python-sproto 第一次写Python的C扩展,留点笔记记录一下.主要的参考文档是:Extending Python with C/C++, 之前也看过cython,但是用Python语法写C还是没学会,稍后再尝试用cython写一遍看看. 作为一个C扩展,是以Module的方式import进去代码里使用的,所以需要注册一下,把自己的接口告诉Python解释器.代码如下图: static PyMethodDef pys…
之前对skynet的印象,主要是来自于我对golang的理解,对gevent开发的经验,以及云风的blog.对于底层的代码,并没有仔细去阅读过.最近在实现业务系统的时候,发现有同事在同一个函数里做了一个互斥的判断,才发现对skynet的理解有误. 以前,用python的gevent框架实现游戏服务器的时候,会针对每个玩家建立3-5个greenlet(协程),用于处理玩家身上的定时器事件,以及IO操作.然后还有少数几个协程处理全局的定时器事件.当然,战斗是放在独立的进程中实现的,那边基本上每个怪都…
1.skynet pomelo(node.js) elixir(erlang) 周末研究总结 手游这两年发展来看,感觉对实时性要求越来越高,有同事在研究Elixir开发,google得知这东西是基于erlang搞出来的,语法类似ruby: 公司现在客户端采用全cocos2d + c++ + lua,新项目unity3d + c# + lua, lua在产品开发中使用比较频繁,同事了解程度也比较深: 完美情况下自然最好是服务端也使用lua开发,之前就经常发生在服务端ruby代码中写lua的囧像.…
转:  http://forthxu.com/blog/skynet.html skynet是云风编写的服务端底层管理框架,底层由C编写,配套lua作为脚本使用,可换python等其他脚本语言.skynet主要工作是管理注册服务,并开启多线程协调服务之间的调用和通讯. skynet一般用于开发游戏服务端程序. 注意:资料开始往github组织账号skynetclub上转移,本页面不在进行更新主要收集学习skynet有关的任何内容,如果你有好的资料或者你在研究skynet,可以将资料或链接地址发给…
这遍摘自skynet 的wiki skynet 由一个或多个进程构成,每个进程被称为一个 skynet 节点.本文描述了 skynet 节点的启动流程. skynet 节点通过运行 skynet 主程序启动,必须在启动命令行传入一个 Config 文件名作为启动参数.skynet 会读取这个 config 文件获得启动需要的参数. 第一个启动的服务是 logger ,它负责记录之后的服务中的 log 输出.logger 是一个简单的 C 服务,skynet_error 这个 C API 会把字符…
skynet的启动时需带个配置文件,这个文件其实是作为lua全局变量用的,见 int main(int argc, char *argv[]) { const char * config_file = NULL ; ) { config_file = argv[]; } else { fprintf(stderr, "Need a config file. Please read skynet wiki : https://github.com/cloudwu/skynet/wiki/Confi…
     云风的skynet,定义为一个游戏服务器框架,用c + lua基于Actor模型实现.代码极其精简,c部分的代码只有三千行左右.      整个skynet框架要解决的核心问题是:把一个消息(数据包)从一个服务(Actor)发送给另一个服务(Actor),并接收其返回.也就是在同一进程内(作者也强调并非只限于同一进程,因为可能会有集群间的通讯)的一个服务通过类似rpc之类的调用同一进程内的另外一个服务,并接收处理结果.而skynet就是处理这些服务间发送数据包的规则和正确性.    …
最近在读大神云风的开源服务器架构skynet,其中的网络库,云风已经单独开来,可以独立使用. 开源地址: https://github.com/cloudwu/socket-server 网络库已经封装了socket的epoll. 在下载起来的世里面,已经包含了一个例子,但觉得不够明了.于是自己写了个测试例子,分为服务端了客户端,服务端启动并监听端口,客户端启动并连接服务器,向服务器发送消息,并得到服务器的反馈. 服务端代码: #include "socket_server.h" #i…
基于云风的 blog,收集 skynet 的特性以便将来在代码中一一验证. “ ... ” 部分节选自云风的 BLOG. 1. 基于 Erlang-Actor 模式的 C 实现 “把一个符合规范的 C 模块,从动态库(so 文件)中启动起来,绑定一个永不重复(即使模块退出)的数字 id 做为其 handle .模块被称为服务(Service),服务间可以自由发送消息.每个模块可以向 Skynet 框架注册一个 callback 函数,用来接收发给它的消息.每个服务都是被一个个消息包驱动,当没有包…
logpath = "."harbor = 1address = "127.0.0.1:2526"master = "127.0.0.1:2013"start = "main" -- main scriptbootstrap = "snlua bootstrap" -- The service for bootstrapstandalone = "0.0.0.0:2013"luaserv…
local skynet = require("skynet") skynet.start(start_func) c服务snlua启动后执行的第一个lua文件里面的主逻辑必定是skynet.start(start_func),由此开始运行lua服务的逻辑 start_func是当前lua服务的初始化函数,也是当前服务的第一个协程的函数 之后在收到非response消息时dispatch_message会创建更多的协程来做逻辑 而调用skynet.start(start_func)的主…
启动skynet需要一个配置文件 我们看下examples/config root = "./"         表示根目录是skynet启动时的目录thread = 8        启动的工作线程数logger = nil       它决定了 skynet 内建的 skynet_error 这个 C API 将信息输出到什么文件中.如果 logger 配置为 nil ,将输出到标准输出,你可以指定一个路径和文件名,这样 “终端”输出的内容就写到日志中文件了 logpath = &…
记录下命令 git clone https://github.com/cloudwu/skynet.git sudo apt-get install autoconf sudo apt-get install libreadline-dev make linux lua5.3.0 发现个不错的skynet研究网站http://forthxu.com/blog/skynet.html Read Wiki https://github.com/cloudwu/skynet/wiki The FAQ…
学习云风的skynet源代码,简单记录下. void skynet_globalmq_push(struct message_queue * queue) { struct global_queue *q= Q; uint32_t tail = GP(__sync_fetch_and_add(&q->tail,1)); // only one thread can set the slot (change q->queue[tail] from NULL to queue) if (!…
当skynet启动的时候,会依据配置文件制定的日志文件来创建一个logger context.详细过程就是找到logger.so动态链接文件.而后调用其logger_create函数(參数是配置的日志文件),而后构建这个服务相应的context(重要的是里面注冊了该服务的回调函数_logger())和消息队列,最后运行logger_init函数.把logger的消息队列放入global queue.关键代码例如以下: handle = skynet_handle_register(ctx); /…
今天遇到一个问题,在大厅服务中,如果一个请求使用到了一个公共的变量,如何保证其一致性? 虽然请求是挨个运行的,但是skynet.call会阻塞. "同一个 skynet 服务中的一条消息处理中,如果调用了一个阻塞 API ,那么它会被挂起.挂起过程中,这个服务可以响应其它消息.这很可能造成时序问题,要非常小心处理." 在其他语言中,比如c#,我们使用lock的办法,把变量或者执行的代码锁起来. 在skynet中用下面的办法解决 local sk_queue = require &quo…
今天来说说Skynet客户端和服务端网络通信的基础部分. Skynet当前版本.lua是skynet自带的5.3版本. 根据示例,我们可以知道.通信的步骤如下. 客户端按大小端打包成二进制. socket发送. 服务端接收. 服务端解包. 逐个说说这其中的操作方法. 1.第一步 local result = string.pack(">s2","string2pack") pack > 表示按大端顺序.s2 表示按照2个字节打包.我们知道string由c…
当你走过一个坐在自己店门前的杂货商面前.走过一个吸着烟斗的守门人面前,走过一个马车夫面前时,请你给我描绘一下这个杂货商.守门人和马车夫,他们的姿态,他们的外貌,要用画家那样的细节描绘出他们的精神本质,使我不至于把他们同任何别的杂货商人.任何别的守门人.任何别的马车夫混同起来,还请你只用一句话就让我知道马车夫有一匹马同其他的马是不一样的. --福楼拜指导莫泊桑 从今天开始,我给自己设定了几个小目标,其中之一是:每天都写上几千字或者半个小时.今天是开始码字的第一天,坐在电脑前想了好一会,从写什么开始…
最近花了一周时间对场景服务进行热点分析,利用以前的火焰图工具做了一点微小的贡献,分享下心得(仓库地址在https://github.com/spin6lock/skynet_systemtap_set). Skynet是一个轻量级的多线程在线游戏框架.线程作为worker,从服务的队列中抽出有消息的,然后处理上面的消息.服务间通过发消息来相互通信.目前服务主要是用Lua进行编写. 以前做的火焰图工具,没法单独看一个skynet服务的堆栈,只能看到整个进程的.要想针对单个服务做优化分析,需要抓出s…
之前搞过一下systemtap(systemtap折腾笔记),可惜很快琐事缠身,没有继续搞下去.最近偷空搞了一下,有点意思. 章大大的思路,是用perl生成systemtap脚本,从/proc/$pid/maps里面扫出liblua.so的地址.然后hook这个地址里,以luaL_*和lua_*开头的lua虚拟机C函数.hook住的函数里,都会有个参数L,这个L表示lua的虚拟机.接下来就是按lua的C代码撸一遍,看看怎么从L的内存结构里,dump出整个lua的运行栈.相当于在systemtap…