关于lua扩展库lpack的使用指南

   2023-02-09 学习力0
核心提示: 最近在研究luasocket,准备用全部用lua的扩展库来实现一套轻量级框架,用来做一些工具、简单的游戏服务器,以及作为网络库用在cocos2dx中。完善的网络库必然会遇到粘包、半包的问题,luasocket也不例外,由于网络部分在lua,协议的制定和buff的解析都没有合

 

  • 最近在研究luasocket,准备用全部用lua的扩展库来实现一套轻量级框架,用来做一些工具、简单的游戏服务器,以及作为网络库用在cocos2dx中。
  • 完善的网络库必然会遇到粘包、半包的问题,luasocket也不例外,由于网络部分在lua,协议的制定和buff的解析都没有合适的方案,又不想在C++中来封装接口,后面在网上查了一些资料,发现lua也有一个二进制打包的扩展库——lpack,了解之后发现还是蛮好用的,就决定使用它来做buff解析,用以解决粘包、半包的问题。

  • 首先需要下载lpack的源码,地址是lpack的下载地址,然后解压,里面有lpack.c和makefile文件。
  • 然后是编译lpack,有两种方式来编译和初始化lpack 
    1、将lpack.c加到宿主程序的源码里面,然后在初始化lua的地方调用初始化函数:

    luaopen_pack(lua_state);
  • 2、将lpack编译成dll(so),然后在lua里面调用:

    require("lpack")

  • 然后说一下lpack的接口,lpack扩展库提供了两个接口,pack和unpack。但是有两种调用方法,使用宏(USE_GLOBALS)来控制,第一种是使用全局接口(pack/unpack),另外一种是将这两个接口插入到string的空间里面(string.pack/string.unpack)。

  • lpack的具体用法 
    1、打包接口pack的使用,全局名字容易混淆lua本身函数unpack,使用string.pack好些,也可以修改源码修改函数名。

     1 --luapack为我修改的接口名字
     2 local _ss = luapack(">P", "中国asd")
     3 
     4 local _ss2 = luapack(">h", 500)
     5 _ss = _ss.._ss2
     6 print(_ss, #_ss)
     7 
     8 --调用结果
     9 中国asd        9
    10 中国asd       11
  • 2、解包接口unpack的使用

     1 --luaunpack为我修改的接口名字
     2 --使用方式1
     3 local ne, value = luaunpack(_ss, ">P")
     4 print(ne, value)
     5 
     6 _ss = string.sub(_ss, ne, #_ss)
     7 local ne, value = luaunpack(_ss, ">h")
     8 print(ne, value)
     9 
    10 --调用结果
    11 10      中国asd
    12 3       500
    13 
    14 --使用方式2
    15 local ne, value1, value2 = luaunpack(_ss, ">Ph")
    16 print(ne, value, value2)
    17 
    18 --调用结果
    19 12      中国asd 500
  • 打包变量类型定义

  •  1     #define OP_ZSTRING  'z'     //空字符串
     2     #define OP_BSTRING  'p'     //长度小于2^8的字符串
     3     #define OP_WSTRING  'P'     //长度小于2^16的字符串
     4     #define OP_SSTRING  'a'     //长度小于2^32/64的字符串*/
     5     #define OP_STRING   'A'     //指定长度字符串
     6     #define OP_FLOAT    'f'     /* float */
     7     #define OP_DOUBLE   'd'     /* double */
     8     #define OP_NUMBER   'n'     /* Lua number */
     9     #define OP_CHAR     'c'     /* char */
    10     #define OP_BYTE     'b'     /* byte = unsigned char */
    11     #define OP_SHORT    'h'     /* short */
    12     #define OP_USHORT   'H'     /* unsigned short */
    13     #define OP_INT      'i'     /* int */
    14     #define OP_UINT     'I'     /* unsigned int */
    15     #define OP_LONG     'l'     /* long */
    16     #define OP_ULONG    'L'     /* unsigned long */
  • 打包字节序,分为以下3种
  • 1     #define OP_LITTLEENDIAN '<'     /* little endian */
    2     #define OP_BIGENDIAN    '>'     /* big endian */
    3     #define OP_NATIVE       '='     /* native endian */
  • 好了,到这里如何使用lpack已经很清楚,接着就可以利用lpack的特性设计buff来解析网络字节流了。

  • 也可以使用包管理来进行直接安装:详见 socket使用安装篇

 

微信搜索【水勺子】关注我,获取更多详细信息

关于lua扩展库lpack的使用指南

 

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • LUA解析json小demo
    需要修改的json数据gui-config.json{"configs": [{"server": "JP3.ISS.TF","server_port": 443,"password": "58603228","method": "aes-256-cfb","remarks": ""},{"serv
    03-16
  • 第二十三篇:在SOUI中使用LUA脚本开发界面
    像写网页一样做客户端界面可能是很多客户端开发的理想。做好一个可以实现和用户交互的动态网页应该包含两个部分:使用html做网页的布局,使用脚本如vbscript,javascript做用户交互的逻辑。当需求变化时,只需要在服务端把相关代码调整一下,用户即可看到新的
    03-16
  • windows下编译lua源码"><转>windows下编译lua源
    因为之前一直使用 lua for windows 来搭建lua的使用环境,但是最新的 lua for windows 还没有lua5.2,我又想用这个版本的lua,所以被逼无奈只能自己编一下lua源码。首先从 lua的官网 下载你想要使用的lua源码,比如我下载的就是lua5.2。解压后内容如下:
    03-16
  • lua:使用Lua处理游戏数据
    在之前lua学习:lua作配置文件里,我们学会了用lua作配置文件。其实lua在游戏开发中可以作为一个强大的保存、载入游戏数据的工具。 比如说,现在我有一份表单:data.xls用什么工具解析这个Excel文件并将数据载入游戏?我们可以使用Lua来完成这个工作。不过要
    03-16
  • 第1课 - 学习 Lua 的意义
    第1课 - 学习 Lua 的意义
    第1课 - 学习 Lua 的意义1.Lua 简介           (1) 1993年、巴西(2) 小巧精致的脚本语言,大小只有 200K(3) 用标准C语言写成,能够在所有的平台上编译运行(4) 发明的目标是嵌入在C/C++中,为应用程序提供灵活的扩展和定制功能(5) 不适合用于开发
    03-16
  • RedisTemplate 常用API+事务+陷阱+序列化+pipeline+LUA
    RedisTemplate 常用API+事务+陷阱+序列化+pipel
    https://www.jianshu.com/p/7bf5dc61ca06/https://blog.csdn.net/qq_34021712/article/details/79606551https://www.jianshu.com/p/c9f5718e58f0dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/depe
    03-08
  • Nginx动态路由的新姿势:使用Go取代lua nginx路由规则
    Nginx动态路由的新姿势:使用Go取代lua nginx路
    导语: 在Nitro 中, 我们需要一款专业的负载均衡器。 经过一番研究之后,Mihai Todor和我使用Go构建了基于Nginx、Redis 协议的路由器解决方案,其中nginx负责所有繁重工作,路由器本身并不承载流量。 这个解决方案过去一年在生产环境中运行顺畅。 以下是我
    03-08
  • cocos2d-lua 控制台输入Lua指令方便调试
    用脚本进行开发,如果不能实时去输入指令,就丧失了脚本的一大特色,所以对cocos2d-x程序稍微修改下,使其可以直接从控制台读入lua指令,方便调试。1 首先在行首加入lua的引用,如下1 #include "main.h"2 #include "AppDelegate.h"3 #include "cocos2d.h"4 #i
    02-09
  • lua_touserdata
    void *lua_touserdata(lua_State*L,intindex);如果给定索引处的值是一个完整的userdata,函数返回内存块的地址。如果值是一个lightuserdata,那么就返回它表示的指针。否则,返回NULL。例如: 在CCLuaStack::executeFunction()函数中有一段代码是用来获取c++
    02-09
  • Lua 5.2 中文参考手册
    闲来无事,发现Lua更新到了5.2.2,参考手册也更到了5.2,在网上发现只有云风翻译的5.1版,花了几天时间翻译了一些。参考手册有点长,又要随时修改,所以在github上建了项目,有需要的朋友可以看看,同时也欢迎指正。中文手册:Lua 5.2中文参考手册
    02-09
点击排行