关于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好些,也可以修改源码修改函数名。

    --luapack为我修改的接口名字
    local _ss = luapack(">P", "中国asd")
    
    local _ss2 = luapack(">h", 500)
    _ss = _ss.._ss2
    print(_ss, #_ss)
    
    --调用结果
    中国asd        9
    中国asd       11

    2、解包接口unpack的使用

    --luaunpack为我修改的接口名字
    --使用方式1
    local ne, value = luaunpack(_ss, ">P")
    print(ne, value)
    
    _ss = string.sub(_ss, ne, #_ss)
    local ne, value = luaunpack(_ss, ">h")
    print(ne, value)
    
    --调用结果
    10      中国asd
    3       500
    
    --使用方式2
    local ne, value1, value2 = luaunpack(_ss, ">Ph")
    print(ne, value, value2)
    
    --调用结果
    12      中国asd 500
  • 打包变量类型定义
        #define OP_ZSTRING  ‘z‘     //空字符串
        #define OP_BSTRING  ‘p‘     //长度小于2^8的字符串
        #define OP_WSTRING  ‘P‘     //长度小于2^16的字符串
        #define OP_SSTRING  ‘a‘     //长度小于2^32/64的字符串*/
        #define OP_STRING   ‘A‘     //指定长度字符串
        #define OP_FLOAT    ‘f‘     /* float */
        #define OP_DOUBLE   ‘d‘     /* double */
        #define OP_NUMBER   ‘n‘     /* Lua number */
        #define OP_CHAR     ‘c‘     /* char */
        #define OP_BYTE     ‘b‘     /* byte = unsigned char */
        #define OP_SHORT    ‘h‘     /* short */
        #define OP_USHORT   ‘H‘     /* unsigned short */
        #define OP_INT      ‘i‘     /* int */
        #define OP_UINT     ‘I‘     /* unsigned int */
        #define OP_LONG     ‘l‘     /* long */
        #define OP_ULONG    ‘L‘     /* unsigned long */
    • 打包字节序,分为以下3种
        #define OP_LITTLEENDIAN ‘<‘     /* little endian */
        #define OP_BIGENDIAN    ‘>‘     /* big endian */
        #define OP_NATIVE       ‘=‘     /* native endian */
  • 好了,到这里如何使用lpack已经很清楚,接着就可以利用lpack的特性设计buff来解析网络字节流了。再次吐槽一下,这个编辑器没换缩进很难使用啊!!
时间: 2024-08-26 19:05:35

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

cocos2d-x 3.3 导入lua扩展库

cocos2d-x 导入lua扩展库有几个点需要注意: 1.cocos2d-x 中的lua版本为5.1.4,所导入的lua库需要对应相应的版本库. 2.在vs 2012 中编译cocos2d-x ,添加的C文件需要注明用C编译,如一般.h文件需要这样写 #ifndef __LUA_LPEG_H_ #define __LUA_LPEG_H_ #if __cplusplus extern "C" { #endif #include "lua.h" #include &q

Linux下安装PHP的lua扩展库

一.安装Lua 5.3.4 下载 http://www.lua.org/ftp/lua-5.3.4.tar.gz tar xvf lua-5.3.4.tar.gz cd lua-5.3.4 重要:进入解压缩后的路径 cd .../lua-5.3.4/src 打开Makefile文件 在CFLAG一行 添加选项 -fPIC 像这样: 找到源文件的这行替换掉 CFLAGS= -O2 -Wall -DLUA_COMPAT_ALL $(SYSCFLAGS) -fPIC $(MYCFLAGS) 然后编译.

手动使用C/C++编写Lua扩展插件

最近在研究如何在Windows 下嵌入Lua来完成业务模块编写的时候 发现Lua的一些问题,首先Lua作为一门脚本语言,其灵活性和可扩展性是很高的,要不然Cocos2d-x中也不会嵌入他来编写业务逻辑,但是由于国内资料相当的少,很少有人去正八经研究完了之后 写一篇文章 来分享自己的成果,想要去深入理解应用一些东西得时候,显得很无力,很多Lua扩展都是直接写扩展库来完成,如果不理解原理甚至你都不会灵活运用,这就是本文写作的目的. 第一 我需要Lua嵌入我的应用程序,这一点很容易的做到. 第二 我需

扩展方法(C# 编程指南)

扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异. 最常见的扩展方法是 LINQ 标准查询运算符,它将查询功能添加到现有的 System.CollectionsIEnumerable 和 System.Collections.GenericIEnumer

玩转 Nginx 之:使用 Lua 扩展 Nginx 功能

1.Nginx 简介 Nginx 作为一款面向性能设计的HTTP服务器,相较于Apache.lighttpd具有占有内存少,稳定性高等优势.其流行度越来越高,应用也越来越广泛,常见的应用有:网页服务器.反向代理服务器以及电子邮件(IMAP/POP3)代理服务器,高并发大流量站点常用来做接入层的负载均衡,还有非常常见的用法是作为日志采集服务器等. Nginx 整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活.其中模块化设计是nginx的一大卖点,甚至http服务器核心功能也是一个模块.要

用lua扩展你的Nginx(整理)

首先得声明,这不是我的原创,是在网上搜索到的一篇文章,原著是谁也搞不清楚了,按风格应该是属于章亦春的文章. 整理花了不少时间,所以就暂写成原创吧. 一. 概述 Nginx是一个高性能,支持高并发的,轻量级的web服务器.目前,Apache依然web服务器中的老大,但是在全球前1000大的web服务器中,Nginx的份额为22.4%.Nginx采用模块化的架构,官方版本的Nginx中大部分功能都是通过模块方式提供的,比如Http模块.Mail模块等.通过开发模块扩展Nginx,可以将Nginx打造

Github上比较流行的PHP扩展库项目

这里列出比较常用的PHP开源扩展库项目: swoole, C扩展实现的PHP异步并行网络通信框架,可以重新定义PHP.过去PHP只能做Web项目,现在有了Swoole.任意服务器端程序都可以用PHP来写. yaf,C扩展实现的高性能Web开发框架. php-webim,基于swoole实现的Web即时聊天工具,支持websocket+http comet长链接推送,可以发送文字内容和图片. react 使用PHP代码实现异步框架.如果说swoole是node.js的升级版,react.php就是

用 phpize 编译共享 PECL 扩展库

有时候不能用 pecl 安装命令.这可能是因为在防火墙后面,或者是因为想要安装的扩展库还没有 PECL 兼容的包,例如 SVN 中尚未发布的扩展库.如果要编译这种扩展库,可以用更底层的编译工具来手工进行编译. phpize 命令是用来准备 PHP 扩展库的编译环境的.下面例子中,扩展库的源程序位于 extname 目录中: $ cd extname $ phpize $ ./configure $ make # make install 成功的安装将创建 extname.so 并放置于 PHP

Centos中编辑php扩展库

今天需要在Centos中编译Exif库以便获取图片的exif信息,可在Linux中从来没有编译过扩展库呀,只好查资料了.发现是用phpize这个东东来编译扩展. 首先执行了下 php -i | grep config 看了下编译php的时候没有加上exif扩展. 那么第一步,当然是进入源码目录里面的Exif目录下面.然后再找到phpize的路径,phpize这个一般是安装完php后的目录下面的 cd /alidata/server/php-5.4/ext/exif /alidata/server