sproto所有的编码都以小端方式编码。
以传输proto协议字符串为例子,使用sproto定义协议时,格式为:
.package {
type 0 : integer
session 1 : integer
}
get 1 {
request {
what 0 : string
}
response {
result 0 : string
}
}
实际传输时会被拆分为两部分:
protocol = {
get = {
tag = 1,
request = get.request,
response = get.response,
}
},
type = {
package = {
{tag = 0 typename = integer name = type },
{ tag = 1 typename = integer name = session },
},
get.request = {
{ tag = 0 typename = string name = what },
},
get.response = {
{ tag = 0 typename = string name=result },
},
};
通过一系列复杂的打包拆包,最后转化为C里面的数据结构,sproto的结构由内存池、类型,协议和两个标记组成:
struct sproto {
struct pool memory;
int type_n;
int protocol_n;
struct sproto_type * type;
struct protocol * proto;
};
打包拆包的部分还在看,基本就是一些对数据块读取的协议。
本来想着要将sproto绑定lua转化到可以直接通过C++去绑定,但是后来看到一个仁兄的做法,简单粗暴,将写好的协议直接调用sprotoparser打包然后保存起来,再通过在C里面去读取这个包来获得协议;需要处理的就是对信息的打包和拆包了。