关于lua扩展库lpack的使用指南
- 最近在研究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使用安装篇
微信搜索【水勺子】关注我,获取更多详细信息