博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于GB28181RTPoverTCP的发送程序拾遗
阅读量:4074 次
发布时间:2019-05-25

本文共 2360 字,大约阅读时间需要 7 分钟。

前言:作为一个计算机专业的老人,一直在逛CSDN、pudn等各种相关的论坛,却很少发表东西,决定从今天开始记录一下自己的日常工作,以便温故而知新并欢迎大家指正与大家共勉。

第一篇 基于GB28181RTPoverTCP的发送程序拾遗

1、TCP send 与 recv

        概念1:每个TCP socket在内核中都有发送缓冲区和接收缓冲区,接收缓冲区把数据写入内核,应用程序没有读取的话,此数据会一直缓存在相应的socket接收缓存里面。

        概念2:滑动窗口:概括为TCP发送和接收双方把一整条数据链分为已发送数据、已确认数据、未确认数据、不能接受数据,而沿着数据链边滑动、边确认、边接收的概念。

        概念3:对于TCP,如果应用进程一直没有读取,buffer满了之后会通知对端TCP窗口关闭,而UDP会直接丢弃。

2、RTP基于TCP的发送概念

        根据国标GB28181概念,PS包经RTP打包后,在RTP包头加上两个字节的RTP分包长度即可发送;

        所以大致算法思路是:检测PS包头“00 00 01 BA”,提取一个完整的PS包,以TCP_MAX_SIZE==1400字节为限,如果小于TCP_MAX_SIZE,则直接加12个字节RTP包头和2个字节长度信息的发送;如果大于TCP_MAX_SIZE,则FU_A分片发送。

         如下为RTP包头结构:

/******************************************************************RTP_FIXED_HEADER0                   1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|V=2|P|X|  CC   |M|     PT      |       sequence number         |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|                           timestamp                           |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|           synchronization source (SSRC) identifier            |+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+|            contributing source (CSRC) identifiers             ||                             ....                              |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+******************************************************************/typedef struct{	/* byte 0 */	unsigned char csrc_len : 4; /* CC expect 0 */	unsigned char extension : 1;/* X  expect 1, see RTP_OP below */	unsigned char padding : 1;  /* P  expect 0 */	unsigned char version : 2;  /* V  expect 2 */	/* byte 1 */	unsigned char payload : 7; /* PT  RTP_PAYLOAD_RTSP */	unsigned char marker : 1;  /* M   expect 1 */	/* byte 2,3 */	unsigned short seq_no;   /*sequence number*/	/* byte 4-7 */	unsigned  long timestamp;	/* byte 8-11 */	unsigned long ssrc; /* stream number is used here. */} RTP_FIXED_HEADER;/*12 bytes*/

3 网络字节与主机字节

       网络字节与主机字节转换的主要函数:

        uint32_t htonl(uint32_t hostlong);

        uint16_t htons(uint16_t hostshort);
        uint32_t ntohl(uint32_t netlong);
        uint16_t ntohs(uint16_t netshort);

        h:host; n:net; l:unsigned long; s:unsigned short;

        所谓网络字节顺序(大尾顺序)就是指一个数在内存中存储的时候“高对低,低对高”(即一个数的高位字节存放于低地址单元,低位字节存放在高地址单元中)。但是计算机的内存存储数据时有可能是大尾顺序或者小尾顺序。

转载地址:http://gxwni.baihongyu.com/

你可能感兴趣的文章
React Native(二):属性、状态
查看>>
JSX使用总结
查看>>
React Native(四):布局(使用Flexbox)
查看>>
React Native(七):Android双击Back键退出应用
查看>>
Android自定义apk名称、版本号自增
查看>>
【剑指offer】q50:树中结点的最近祖先
查看>>
二叉树的非递归遍历
查看>>
【leetcode】Reorder List (python)
查看>>
【leetcode】Linked List Cycle (python)
查看>>
【leetcode】Candy(python)
查看>>
【leetcode】Sum Root to leaf Numbers
查看>>
【leetcode】Pascal's Triangle II (python)
查看>>
如何成为编程高手
查看>>
本科生的编程水平到底有多高
查看>>
备忘:java中的递归
查看>>
Solr及Spring-Data-Solr入门学习
查看>>
python_time模块
查看>>
python_configparser(解析ini)
查看>>
selenium学习资料
查看>>
从mysql中 导出/导入表及数据
查看>>