标签:luasocket lpack 粘包 buffer 协议
然后是编译lpack,有两种方式来编译和初始化lpack
1、将lpack.c加到宿主程序的源码里面,然后在初始化lua的地方调用初始化函数:
luaopen_pack(lua_state);
2、将lpack编译成dll(so),然后在lua里面调用:
require("lpack")
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 */
#define OP_LITTLEENDIAN ‘<‘ /* little endian */
#define OP_BIGENDIAN ‘>‘ /* big endian */
#define OP_NATIVE ‘=‘ /* native endian */
好了,到这里如何使用lpack已经很清楚,接着就可以利用lpack的特性设计buff来解析网络字节流了。再次吐槽一下,这个编辑器没换缩进很难使用啊!!
标签:luasocket lpack 粘包 buffer 协议
原文地址:http://blog.csdn.net/ljxfblog/article/details/44339705