1. int
  2. luaopen_netpack(lua_State *L) {
  3. luaL_checkversion(L);
  4. luaL_Reg l[] = {
  5. { "pop", lpop },//从队列头弹出一个netpack,netpack没有被释放
  6. { "pack", lpack },//将string打包成2个字节长度+内容
  7. { "clear", lclear },//释放queue
  8. { "tostring", ltostring },//将userdata转成string
  9. { NULL, NULL },
  10. };
  11. luaL_newlib(L,l);
  12.  
  13. // the order is same with macros : TYPE_* (defined top)
  14. lua_pushliteral(L, "data");//将对应的标签放进栈
  15. lua_pushliteral(L, "more");
  16. lua_pushliteral(L, "error");
  17. lua_pushliteral(L, "open");
  18. lua_pushliteral(L, "close");
  19. lua_pushliteral(L, "warning");
  20.  
  21. lua_pushcclosure(L, lfilter, );
  22. lua_setfield(L, -, "filter");//根据buf的type,解析参数
  23.  
  24. return ;
  25. }

netpack中的定义的结构体

  1. struct netpack {
  2. int id;
  3. int size;
  4. void * buffer;
  5. };
  6.  
  7. struct uncomplete {
  8. struct netpack pack;
  9. struct uncomplete * next;
  10. int read;
  11. int header;
  12. };
  13.  
  14. struct queue {
  15. int cap;//capacity队列容量
  16. int head;
  17. int tail;
  18. struct uncomplete * hash[HASHSIZE];
  19. struct netpack queue[QUEUESIZE];
  20. };

netpack.filter函数主要在gateserver中用于过滤socket类型的消息,然后按照信息类型,返回不同的参数给lua

层调用,在lua中调用过程如下:

  1. skynet.register_protocol {
  2. name = "socket",
  3. id = skynet.PTYPE_SOCKET, -- PTYPE_SOCKET = 6
  4. unpack = function ( msg, sz )
  5. return netpack.filter( queue, msg, sz)
  6. end,
  7. dispatch = function (_, _, q, type, ...)
  8. queue = q
  9. if type then
  10. MSG[type](...)
  11. end
  12. end
  13. }

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)的更多相关文章

  1. skynet 学习笔记-sproto模块(2)

    云风在skynet中继承了sproto的传输协议,对比protobuf的好处是,能明文看到传输内容,而且skynet不需要protobuf这么功能,所以云风也建议在lua层使用sproto来作为sky ...

  2. Python学习笔记—itertools模块

    这篇是看wklken的<Python进阶-Itertools模块小结> 学习itertools模块的学习笔记 在看itertools中各函数的源代码时,刚开始还比较轻松,但后面看起来就比较 ...

  3. Python学习笔记之模块与包

    一.模块 1.模块的概念 模块这一概念很大程度上是为了解决代码的可重用性而出现的,其实这一概念并没有多复杂,简单来说不过是一个后缀为 .py 的 Python 文件而已 例如,我在某个工作中经常需要打 ...

  4. Python3学习笔记25-logging模块

    logging模块,Python自带用来记录日志的模块. 因为工作需要用到关于日志的,最近一直都在看关于日志模块的东西,百度了很多文章,可惜都是看的让人一头雾水,最后运气不错,找到一篇很详细的文章.传 ...

  5. Scikit-Learn模块学习笔记——数据集模块datasets

    scikit-learn 的 datasets 模块包含测试数据相关函数,主要包括三类: datasets.load_*():获取小规模数据集.数据包含在 datasets 里 datasets.fe ...

  6. node 学习笔记 - Modules 模块加载系统 (1)

    本文同步自我的个人博客:http://www.52cik.com/2015/12/11/learn-node-modules-path.html 用了这么久的 require,但却没有系统的学习过 n ...

  7. python学习笔记五 模块上(基础篇)

    模块学习 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要 ...

  8. 网上图书商城项目学习笔记-011Book模块查询(分页)

    一.流程分析 1.图书模块 2.分布分析 二.代码 1.view层 1)list.jsp <%@ page language="java" import="java ...

  9. angular2 学习笔记 ( ngModule 模块 )

    2016-08-25, 当前版本是 RC 5. 参考 : https://angular.cn/docs/ts/latest/guide/ngmodule.html 提醒 : 这系列笔记的 " ...

随机推荐

  1. XXy

    XXy codevs1003 帮我看看 #include<iostream> #include<cstdio> using namespace std; ],map[][],n ...

  2. [Xcode 实际操作]七、文件与数据-(6 )通过通知中心,实现监听和处理程序退出事件的功能

    目录:[Swift]Xcode实际操作 本文将演示通过通知中心,实现监听和处理程序退出事件的功能. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import U ...

  3. openinstall渠道统计工具介绍

    大家好,今天给大家介绍一下如何使用openinstall 来实现APP 渠道统计,做运营推广的朋友应该对渠道统计并不陌生,之前一般都是让技术的同事打渠道包方式进行渠道统计,而且只有安卓才能打渠道包.o ...

  4. 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 ...

  5. Php5.6.15-fpm的运行机制源码剖析

    源码版本:Php5.6.15 源码目录:sapi/fpm/fpm 说明:源码的主要功能在上面直接注解 =============>>start<<=============== ...

  6. PAT甲级——1110 Complete Binary Tree (完全二叉树)

    此文章同步发布在CSDN上:https://blog.csdn.net/weixin_44385565/article/details/90317830   1110 Complete Binary ...

  7. VUE中模块与组件

    组件:我们项目中,每一个资源(.js,.css,.vue,...)都是一个模块,这些模块是相互独立,但是我们可以通过类似于webpack构建工具把它们整合在一起,你可以理解为模块就是一个一个积木,通过 ...

  8. POJ 3735 Training little cats 矩阵快速幂

    http://poj.org/problem?id=3735 给定一串操作,要这个操作连续执行m次后,最后剩下的值. 记矩阵T为一次操作后的值,那么T^m就是执行m次的值了.(其实这个还不太理解,但是 ...

  9. C#中的XML文档注释-推荐的文档注释标记

    文档注释是为了方便自己和他人更好地理解代码所实现的功能.下面记录了一些常用的文档注释标记: <C> 用法: <c>text</c> 将说明中的文本标记为代码.例如: ...

  10. .net笔试题二(填空题、选择题)

    1.面向对象的语言具有_______性.________性._______性答:封装.继承.多态. 2.能用foreach遍历访问的对象需要实现 ____________接口或声明__________ ...