有关TLV协议的相关内容,以及基于C语言的简单实现。都是个人理解,有许多不足,仅供参考(•̀⌄•́)
—— By Jihan
概要介绍
首先,关于TLV协议本质,网上有许多讲解,可以先搜索TLV相关讲解,我自己的实现思路参考这篇帖子。
这里通俗概括:
T:Type,表示字段标签和编码格式。
L:Length,表示数据长度。
V:Value,表示实际传输内容。
图片来源:http://www.wtango.com/
TLV的优势
而使用TLV的作用是什么呢?概括为将格式数据序列化处理(可能表述不太专业),并且能够有一个约定的通信方式进行通信。意思是,方便你在网络中传输结构体。例如:
你想传输结构体:
1 | struct Message{ |
你会开辟一片buf来存放这个结构体,然后传输过去,如果其中有指针,还需要数据整理。
这个思路意味着你传输数据针对的是你结构体中的每一个数据。而如果你要增加一个字段,则需要关注你传输代码的正确与否。例如你增加一个char new[1024]
那么,你开辟的buf,返回的数据对应,都需要检查。正如你买菜的时候需要关注每一样菜放的位置对不对。并且,不同设备和语言之间传输数据时,这种传输方式就显得非常难受,甚至不可用。
使用TLV的好处,在于将你的传输数据进行打包:
1 | T:0x01 |
这样你在以TLV格式编写传输代码的时候,就不会关注实际传输内容是什么。仅仅将内容当成一个装满蔬菜的篮子,而非每个蔬菜。这样,你如何更改菜篮子里的蔬菜,对于整个传输过程来说,都不受影响。并且只要支持标准的TLV传输协议的,不论什么底层平台和语言,都能够相互传输。说白了,就是一个网络传输的通用性封装。┐(´-`)┌
简单示例代码
代码参考两篇文章:TLV简介
C语言socket编程 其中关于实际数据的大小端转换没有做,在同平台计算机没有影响。并且我这儿只是非常简单的示例,没有按照标准的TLV进行TAG解析以及Length处理。有兴趣的可以按照这个更加标准的示例来看。
TLV.c:
1 | // |
TLV.h:
1 | // |
test.c:
1 |
|
Makefile:
1 | # by jihan |
linux 平台下:
make
./a.out
运行server
./a.out
运行client