TLV Type Length Value 机制

传统数据传输,不同情况下会容易做成数据收发错误

  1. 例如:不同系统 32 位元系统,16 位元系统 之间沟通,由于系统对 unsigned int 解释是不同,同一组数据在不同系统会出现不同结果
  2. 系统级别功能不同,导致数据结构差异,例如:系统 A 升级了,多支援2个数据,而系统 B,仍然是旧有结构

TLV 机制提出了解决方案

定义协议

T TLV Type (1 byte)
L Data Length (1 byte)
V Actual Data

例如:定义功能 A,用 132 代表
TLV Type 为 132 
Data Length 为 4 (单组数据)
Actual Data XXXXX

例子数据
132
20
201392385
24
234946817
24
218169601
24
184615169
24

注:上面例子是 ip/mask length e.g. 11.1.1.1/24 11.1.1.1 在 c 语言里用 int 表示

TLV 解码例子

void decode_tlv_132(char *tlv_ptr) {int tlv_type (int)*(tlb_ptr);tlv_ptr++;int data_length = (int)*(tlv_ptr);int unit_tlv_size = get_unit_size(tlv_type); // e.g. 4int i = 0;tlv_ptr++;char ip_address[4];switch(tlv_type) {case 132:{   int n_units = data_length/unit_tlv_size;for(i=0; i<n_units; i++) {#if 0unsigned int ip_address = *((unsigned int *)tlv_ptr);#endifmemcpy(ip_address, tlv_ptr, 4); tlv_ptr += 4;char mask = *tlv_ptr;tlv_ptr++;}   }   break;default:{   tlv_ptr += data_length;}   break;}
}

重点

  • #if 0 是传统容易出错和不支援新功能地方
  • 使用 char 或 byte 不要使用基于系统的数据类型 例如: unsigned int
  • 上面 default: 是对新功能的支援

序列化和反序列化例子

对于 TLV 机制,提供了数据序列化和反序列化参考

序列化

typedef struct serialized_buffer {char *b;int size;int next;
} ser_buff_t;void init_serialized_buffer(ser_buff_t **) {(*b) = (ser_buff_t *)calloc(1, sizeof(ser_buff_t);(*b)->b = calloc(1, SERIALIZE_BUFFER_DEFAULT_SZIE); // e.g. 100(*b)->size = SERIALIZE_BUFFER_DEFAULT_SIZE;(*b)->next = 0;
}ser_buff_t *stream;
init_serialized_buffer(&stream);
void serialize_data(ser_buff_t *buff, char *data, int nbytes) {int available_size = buff->size - buff->next;char isResize = 0;while(available_size < nbytes) {buff->size = buff->size * 2;available_size = buff->size - buff->next;isResize = 1;}if(isResize == 0) {memcpy((char *)buff->b + buff->next, data, nbytes);buff->next += nbytes;return;}buff->b = realloc(buff->b, buff->size);memcpy((char *)buff->b + buff->next, data, nbytes);buff->next += nbytes;return;
}
  • buff 为缓存
  • buff->b 为当前位置
  • buff->next 为下一组数据位置
  • buff->size 为缓存大小

使用 序列化 例子

ser_buff_t *stream;
init_serialized_buffer(&stream);char data = 132;
serialize_data(stream, &data, 1);data = 20;
serialize_data(stream, &data, 1);unsigned int ip = 201392385;
serialize_data(stream, &ip, 4);char mask = 24;
serialize_data(stream, &mask, 1);ip = 234946817;
serialize_data(stream, &ip, 4);mask = 24;
serialize_data(stream, &mask, 1);...

反序列化

void de_serialize_data(char *dest, ser_buff_t *b, int size) {memcpy(dest, b->b + b->next, size);b->next += size;
}

使用 反序列化 例子

unsigned int dest;
de_serialize_data((char *)&dest, b, 4);
  • b 为 例如:经过网络接收到的 buffer

Linux 系统编程技巧与概念 第12章 基于 TLV 传输相关推荐

  1. Linux 系统编程技巧与概念 第14章 字节次序

    字节次序 e.g. unsigned short int a = 1; 会用 2 bytes 表示 HEX 0 1 BIN 00000000 00000001 Big Endian 表示方式 内存地址 ...

  2. Linux 系统编程技巧与概念 第11章 不透明指针

    不透明指针 Opaque Pointers 用来防止用户重复或不正确实现库提供的功能 所以属性皆为私有 现实常用 实现例子: 重点 ll_node_ 不对于,这样外面就不能直接操作,例如 sizeof ...

  3. linux系统编程之进程概念(操作系统---管理,进程创建,进程状态,进程优先级, 环境变量,程序地址空间,进程O(1)调度方法)

    系统编程: 进程概念->进程控制->基础IO->进程间通信->进程信号->多线程 进程概念 冯诺依曼体系结构----现代计算机硬件体系结构 冯诺依曼体系结构----现代计 ...

  4. Linux系统编程- 无名管道(匿名管道)

    无名管道作为Linux进程间通讯,我们这里把理论和实际结合起来说明. 1.什么是管道 管道,英文位pipe,在学习linux系统编程一个重要概念.它的发明人是道格拉斯.麦克罗伊,这位也是UNIX上早期 ...

  5. linux 可定义信号数,Linux系统编程(20)——信号基本概念

    信号及信号来源 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知 ...

  6. Linux 系统编程 -进程概念篇

    Linux系统编程-进程篇 冯诺依曼体系结构 冯诺依曼的两个重要思想 当代计算机的三级缓存 操作系统 操作系统的概念 操作系统的组成 操作系统作用 Linux下的操作系统体系 进程 进程概念 进程特性 ...

  7. 很全的linux网络编程技巧

    注:作者王晓,本人认为总结得很好,故记之,绝无侵权之意. 本文转自:https://www.cnblogs.com/jfyl1573/p/6476607.html 看到好文章想留做自己学习,如有侵权, ...

  8. 外网访问arm嵌入式linux_嵌入式Linux系统编程——文件读写访问、属性、描述符、API

    Linux 的文件模型是从 Unix 的继承而来,所以 Linux 继承了 UNIX 本身的大部分特性,然后加以扩展,本章从 UNIX 系统接口来描述 Linux 系统结构的特性. 操作系统是通过一系 ...

  9. 【Linux系统编程学习】信号、信号集以其相关函数

    此为牛客Linux C++和黑马Linux系统编程课程笔记. 文章目录 0. 信号的概念 1. Linux信号一览表 2. 信号相关函数 3. kill函数 4. raise函数 5. abort函数 ...

最新文章

  1. Maven项目下update maven后Eclipse报错:java.lang.ClassNotFoundException: org.springfra
  2. C语言从文件中读入矩阵,并且将矩阵转置
  3. 数组实例的find()和findIndex()
  4. Shell(6)——array的删改unset
  5. HTML期末网页作业-仿QQ官网QQ注册网页
  6. Python之线程(一)
  7. 甲骨文解雇Java相关人员 Oracle cuts Java execs
  8. python解释器 pip安装_Windows下安装Python解释器并配置pip
  9. 夏普扫描显示没有所选服务器,夏普扫描绑定服务器地址
  10. virtuoso根据原理图绘制版图并联接_virtuoso画原理图
  11. ps钢笔路径打不出字怎么解决?
  12. 个人开发者应用如何接入主流微信和支付宝支付
  13. 怎样关闭qq位置定位服务器,手机qq怎么关闭定位
  14. 最简单的ESP8266的Wifi智能小车车教程
  15. 基于微信小程序开发的demo
  16. cad在线转换_手绘稿画好后我熬了一个通宵描图,结果组长给我说可以一键生成CAD!...
  17. 机器人行业中我们常说的roll、yaw、pitch是什么?
  18. 毫无疑问计算机犯罪是一个很严重的问题英语,英语四级作文高分句型
  19. 2009-2021系统架构设计师(高级)历年论文题目
  20. 生化实验好帮手——牛血清白蛋白粉末,诊断级

热门文章

  1. 远程办公一晃一天,环境搭建履步维艰
  2. 没能 PK 掉 WiFi 的 Li-Fi,可能是 5G 请来的救兵
  3. 作为程序员的我春节还没抢到票却抢到这玩意儿,也是值了!
  4. 干货收藏!史上最强 Tomcat 8 性能优化来啦!| 原力计划
  5. 今日头条把微信按在地上摩擦
  6. 门前异动监控、AI 人脸识别!360 发布新型智能门铃
  7. 对支付宝微信们来说,扫码支付限额 500 元新规意味着什么?
  8. 互联网公司招聘奇葩黑历史:不要学日语,不要信中医,不要黄泛区……
  9. VIVO怎么创建计算机快捷方式,vivo手机快捷键怎么调出来
  10. c语言 linux常用函数,C语言常用函数