zoukankan      html  css  js  c++  java
  • 关于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使用安装篇

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

  • 相关阅读:
    正反向代理工具squid
    docker安装jira
    pandas输出的数据集导入数据库
    python监控接口告警模板
    Auth认证
    Form与ModelForm的 使用
    原生Ajax与jQuery的Ajax和伪Ajax
    Django缓存与信号
    Django的生命周期与中间件的流程
    CSRF的原理和基本使用
  • 原文地址:https://www.cnblogs.com/xiand/p/6897268.html
Copyright © 2011-2022 走看看