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 提醒 : 这系列笔记的 " ...
随机推荐
- codevs 3333 高级打字机
3333 高级打字机 题目描述 Description 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作 ...
- 图论1 Tarjan算法
强连通分量 模板(强联通分量个数+缩点) #include<iostream> #include<cstdio> #define MAXn 100000 #define MAX ...
- IT兄弟连 JavaWeb教程 jQuery中其他AJAX支持的函数
● $.get()函数 $.get(url,data,function,dataType);参数说明如下: url:请求地址 data:请求参数 dataType:服务器返回的数据类型 functi ...
- 剑指Offer的学习笔记(C#篇)-- 对称的二叉树
题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 一 . 题目分析 递归法. 一.空树判断,单独搞出来. 二.非空树. 递归:一 ...
- Java程序的运行机制和JVM
1. Java语言比较特殊, 由Java编写的程序需要经过编译步骤,但这个编译步骤不会产生特定平台的机器码,而是生成一种与平台无关的字节码(也就是.class文件).这种字节码不是可执行性的,必须使用 ...
- Codeforces Round #431 (Div. 2) A
Where do odds begin, and where do they end? Where does hope emerge, and will they ever break? Given ...
- 1081 Rational Sum(20 分)
Given N rational numbers in the form numerator/denominator, you are supposed to calculate their sum. ...
- Netty(2)Echo
上节介绍的是discard协议,即不给客户端返回消息.本节主要说下,echo协议,即服务端收到消息后原样返回给客户端. 为了实现此需求,只需要在DiscardServerHandler中重写chann ...
- NetCore中使用Myrmec
NetCore中使用Myrmec Myrmec 是什么? Myrmec 是一个用于检测文件格式的库,Myrmec不同于其它库或者手写检测代码,Myrmec不依赖文件扩展名(在实际使用中,你的用户很可能 ...
- kindeditor 修改上传图片的路径的方法
默认情况下kindeditor上传的图片在编辑器的根目录/attached/目录下.以日期建一个目录,然后保存文件.有些时候大概我们并不想这样.考虑到更新编辑器,或更换编辑器不太方便.比如我现在想把上 ...