skynet 学习笔记-netpack模块(1)
- int
- luaopen_netpack(lua_State *L) {
- luaL_checkversion(L);
- luaL_Reg l[] = {
- { "pop", lpop },//从队列头弹出一个netpack,netpack没有被释放
- { "pack", lpack },//将string打包成2个字节长度+内容
- { "clear", lclear },//释放queue
- { "tostring", ltostring },//将userdata转成string
- { NULL, NULL },
- };
- luaL_newlib(L,l);
- // the order is same with macros : TYPE_* (defined top)
- lua_pushliteral(L, "data");//将对应的标签放进栈
- lua_pushliteral(L, "more");
- lua_pushliteral(L, "error");
- lua_pushliteral(L, "open");
- lua_pushliteral(L, "close");
- lua_pushliteral(L, "warning");
- lua_pushcclosure(L, lfilter, );
- lua_setfield(L, -, "filter");//根据buf的type,解析参数
- return ;
- }
netpack中的定义的结构体
- struct netpack {
- int id;
- int size;
- void * buffer;
- };
- struct uncomplete {
- struct netpack pack;
- struct uncomplete * next;
- int read;
- int header;
- };
- struct queue {
- int cap;//capacity队列容量
- int head;
- int tail;
- struct uncomplete * hash[HASHSIZE];
- struct netpack queue[QUEUESIZE];
- };
netpack.filter函数主要在gateserver中用于过滤socket类型的消息,然后按照信息类型,返回不同的参数给lua
层调用,在lua中调用过程如下:
- skynet.register_protocol {
- name = "socket",
- id = skynet.PTYPE_SOCKET, -- PTYPE_SOCKET = 6
- unpack = function ( msg, sz )
- return netpack.filter( queue, msg, sz)
- end,
- dispatch = function (_, _, q, type, ...)
- queue = q
- if type then
- MSG[type](...)
- end
- end
- }
netpack.pack函数主要将一个字符串打包成2个字节的长度+字符串,然后返回到lua层,这个功能类似于string.pack(">s2", str),这个功能有可能是lua5.1版本的skynet遗留下来的功能。
netpack.pop函数主要是通过弹出队列中的头元素,在gateserver.lua接收到data类型的消息时,会将接收到的buffer加到queue中,当pop的时候,然后返回queue中头成员的netpack结构体中的成员变量。
netpack.clear函数,主要释放queue中的所有内存
netpack.tostring函数,通过lua层传入userdata对象,强制转换为string类型返回给lua层
转载请注明出处,from 博客园HemJohn
skynet 学习笔记-netpack模块(1)的更多相关文章
- skynet 学习笔记-sproto模块(2)
云风在skynet中继承了sproto的传输协议,对比protobuf的好处是,能明文看到传输内容,而且skynet不需要protobuf这么功能,所以云风也建议在lua层使用sproto来作为sky ...
- Python学习笔记—itertools模块
这篇是看wklken的<Python进阶-Itertools模块小结> 学习itertools模块的学习笔记 在看itertools中各函数的源代码时,刚开始还比较轻松,但后面看起来就比较 ...
- Python学习笔记之模块与包
一.模块 1.模块的概念 模块这一概念很大程度上是为了解决代码的可重用性而出现的,其实这一概念并没有多复杂,简单来说不过是一个后缀为 .py 的 Python 文件而已 例如,我在某个工作中经常需要打 ...
- Python3学习笔记25-logging模块
logging模块,Python自带用来记录日志的模块. 因为工作需要用到关于日志的,最近一直都在看关于日志模块的东西,百度了很多文章,可惜都是看的让人一头雾水,最后运气不错,找到一篇很详细的文章.传 ...
- Scikit-Learn模块学习笔记——数据集模块datasets
scikit-learn 的 datasets 模块包含测试数据相关函数,主要包括三类: datasets.load_*():获取小规模数据集.数据包含在 datasets 里 datasets.fe ...
- node 学习笔记 - Modules 模块加载系统 (1)
本文同步自我的个人博客:http://www.52cik.com/2015/12/11/learn-node-modules-path.html 用了这么久的 require,但却没有系统的学习过 n ...
- python学习笔记五 模块上(基础篇)
模块学习 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要 ...
- 网上图书商城项目学习笔记-011Book模块查询(分页)
一.流程分析 1.图书模块 2.分布分析 二.代码 1.view层 1)list.jsp <%@ page language="java" import="java ...
- angular2 学习笔记 ( ngModule 模块 )
2016-08-25, 当前版本是 RC 5. 参考 : https://angular.cn/docs/ts/latest/guide/ngmodule.html 提醒 : 这系列笔记的 " ...
随机推荐
- XXy
XXy codevs1003 帮我看看 #include<iostream> #include<cstdio> using namespace std; ],map[][],n ...
- [Xcode 实际操作]七、文件与数据-(6 )通过通知中心,实现监听和处理程序退出事件的功能
目录:[Swift]Xcode实际操作 本文将演示通过通知中心,实现监听和处理程序退出事件的功能. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import U ...
- openinstall渠道统计工具介绍
大家好,今天给大家介绍一下如何使用openinstall 来实现APP 渠道统计,做运营推广的朋友应该对渠道统计并不陌生,之前一般都是让技术的同事打渠道包方式进行渠道统计,而且只有安卓才能打渠道包.o ...
- MCP|BFY|Proteome Analysis of Human Neutrophil Granulocytes From Patients With Monogenic Disease Using Data-independent Acquisition(单基因疾病患者中性粒细胞的DIA蛋白质组分析)
文献名:Proteome Analysis of Human Neutrophil Granulocytes From Patients With Monogenic Disease Using Da ...
- Php5.6.15-fpm的运行机制源码剖析
源码版本:Php5.6.15 源码目录:sapi/fpm/fpm 说明:源码的主要功能在上面直接注解 =============>>start<<=============== ...
- PAT甲级——1110 Complete Binary Tree (完全二叉树)
此文章同步发布在CSDN上:https://blog.csdn.net/weixin_44385565/article/details/90317830 1110 Complete Binary ...
- VUE中模块与组件
组件:我们项目中,每一个资源(.js,.css,.vue,...)都是一个模块,这些模块是相互独立,但是我们可以通过类似于webpack构建工具把它们整合在一起,你可以理解为模块就是一个一个积木,通过 ...
- POJ 3735 Training little cats 矩阵快速幂
http://poj.org/problem?id=3735 给定一串操作,要这个操作连续执行m次后,最后剩下的值. 记矩阵T为一次操作后的值,那么T^m就是执行m次的值了.(其实这个还不太理解,但是 ...
- C#中的XML文档注释-推荐的文档注释标记
文档注释是为了方便自己和他人更好地理解代码所实现的功能.下面记录了一些常用的文档注释标记: <C> 用法: <c>text</c> 将说明中的文本标记为代码.例如: ...
- .net笔试题二(填空题、选择题)
1.面向对象的语言具有_______性.________性._______性答:封装.继承.多态. 2.能用foreach遍历访问的对象需要实现 ____________接口或声明__________ ...