根据Lua Table设计协议

Lua Protocol

使用Lua Table语法定义协议模板。

设计由来

使用Lua开发游戏已经有两年多了,最初接触到的网络交互协议是由老大设计的。只支持整数和字符串类型的数据,后面的主程添加了元素为Lua表的数组类型的数据。主要核心在于Buffer的存储形式:

添加新类型

我现在添加了表,浮点数,完整的数组。

定义协议语法

local proto_struct = {
    tbl_data = {
        int_data = 0,
        float_data = 0.1,
        str_data = "default string",
        int_array = {1},
        float_array = {1.1},
        str_array = {""},
    },
    tbl_array = {
        {
            name = "tbl_array_element",
            id = 1,
        },
    },
}

Buffer格式

int 类型

sign 1byte 1byte
- 0xF1 0x00~0xFF
+ 0x01 0x00~0xFF
sign 1byte 2byte
- 0xF2 0x0100~0xFFFF
+ 0x02 0x0100~0xFFFF
sign 1byte 4byte
- 0xF3 0x00010000~0xFFFFFFFF
+ 0x03 0x00010000~0xFFFFFFFF
sign 1byte 8byte
- 0xF4 0x0000000100000000~0x7FFFFFFFFFFFFFFF
+ 0x04 0x0000000100000000~0x7FFFFFFFFFFFFFFF

string 类型(float类型转为string类型存储

len_of_string string
int string

array 类型

len_of_array element1 element2 ... elementn
int e1 e2 ... en

table 类型

按key排序依次存储

tbl = {
    a = 1,
    b = 2,
    c = "tbl",
}
a b c
1 2 tbl

协议模板的C数据结构

struct field {
    struct field *next;
    struct field_list *child;
    char type;
    char key[DEFAULT_STR_LEN];
    union {
        char str_value[DEFAULT_STR_LEN];
        int int_value;
    } default_value;
};

struct field_list {
    struct field *head;
    struct field *tail;
    int len;
};
// field 用于存储int/float/string,field_list用于存储array/table

代码已经开源了,在这里https://github.com/hanxi/lproto

点击进入评论 ...