注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mihooke's blog

IT之恋

 
 
 

日志

 
 

Jrtplib源码分析(6)---源码文件功能(下)(一)  

2014-11-26 08:25:00|  分类: jrtplib |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

rtpipv4address.h是描述一个IPv4的地址和端口的,类RTPIPv4Address继承于RTPAddress,是用在基于IPv4传送构件上的,当它用在多播功能上的传送时,端口值将被忽略。构造函数RTPIPv4Address用了重载方法:

RTPIPv4Address(uint32_t ip = 0, uint16_t port = 0):RTPAddress(IPv4Address)

{

 RTPIPv4Address::ip = ip;

 RTPIPv4Address::port = port; 

}

它创建一个带有IP地址和端口数字的实例,这两者都被解释为主机字节顺序。这里用到了成员初始化列表的方法:

RTPIPv4Address(const uint8_t ip[4],uint16_t port = 0):RTPAddress(IPv4Address){ 

RTPIPv4Address::ip = (uint32_t)ip[3];

RTPIPv4Address::ip |= (((uint32_t)ip[2])<<8); 

RTPIPv4Address::ip |= (((uint32_t)ip[1])<<16); 

RTPIPv4Address::ip |= (((uint32_t)ip[0])<<24); 

RTPIPv4Address::port = port; 

}

它也创建一个带有IP地址和端口数字的实例,但是只有端口值被解释为主机字节顺序。下面的成员函数就比较简单了。

除此之外,这个类还可以判断接受的IP地址是否是同一个IP地址,是否是来自同一个主机,并且把地址转换为字符串形式以点分十进制输出,打印函数用的是snprintf函数定义的一个宏,把IP地址存到str数组中。

在这里顺便说下snprintf函数,原型为:

int snprintf(char *str,size_t size,const char *format,...);

参数是可变参数,作用是按照format格式化成字符串,然后将其复制到str中。

 

类似地,还有个rtpipv6address.h的文件,但它是描述IPv6地址的,代码结构和IPv4的差不多,就不再详细赘述了。

 

 

rtplibraryversion.h是提供库的版本(majorminordebug三个版本)信息。类RTPLibraryVersion公有方法是获取版本和版本对应号码的,注意到这个类中,有两个public和两个private关键字,这在类中允许的,也可以归并到一起,作用就是可以随时对这个类进行扩充,方便以后维护。还应该注意到类的一个公有方法前面加了static,说明这是静态成员函数,这里顺便说下静态成员函数。


静态成员函数的显著特点是:无论类创建多少个对象,程序都只创建一个静态类变量副本,它不能在类声明中初始化,因为声明只是描述如何分配内存,而不分配内存,一般在类方法定义的文件中初始化静态类成员,初始化的时候不使用关键字static(在这里,可以看到rtplibraryversion.cpp中对该静态成员函数GetVersion的初始化,为3 7 1,即此时我们看的jrtplib版本是3.7.1),可以用与操作符来说明静态类成员属于哪个类中。如果静态成员是整型或枚举类const,则可以在类声明中初始化。


rtpmemoryobject.h中定义了内存对象处理方法,这些方法在类RTPMemoryObject中包含,考虑到兼容性和全面性,如果定义了rtpsupportmemorymanagement头文件,则为内存管理对象分配内存,否则初始化为0,这样考虑,极好地防止了系统由于无法分配内存导致的崩溃。只有分配了内存,才可以进行下一步的发送包的动作。

 

rtppacket.h则是描述一个RTP包,类RTPPacket可以创建新的用户指定的RTP包,解析RTPRawPacket实例。首先,我们来了解下RTP协议的结构,在rtpstructs.h头文件中,定义了RTP协议的相关结构体(比如,头部、扩展头、源标识符):

struct RTPHeader

{

#ifdef RTP_BIG_ENDIAN

uint8_t version:2;/*版本号,2表示占得位数,下同*/

uint8_t padding:1;/*填充标识*/

uint8_t extension:1;/*扩展标识*/

uint8_t csrccount:4;/*CSRC计数器*/

uint8_t marker:1;/*标记*/

uint8_t payloadtype:7;/*有效载荷类型*/

#else /* little endian*/

uint8_t csrccount:4;

uint8_t extension:1;

uint8_t padding:1;

uint8_t version:2;

uint8_t payloadtype:7;

uint8_t marker:1;

#endif /* RTP_BIG_ENDIAN*/

uint16_t sequencenumber;/*序列号*/

uint32_t timestamp;/*时间戳*/

uint32_t ssrc;

};

这只是存储头部信息,而RTP数据部分是存储在RTPRawPacket中的。

rtppacketbuilder.h是用来构建RTP包的,虽然RTPPacket类页用来创建包,但是这个创建的包比RTPPacket创建的更高级点,涵盖了SSRC标识、时间戳跟踪和序列码等。要想理解整个构建过程并不容易,虽然没有复杂的语法,但是各种类型的包都要考虑到,以及一些异常情况等,是很不容易的。

  评论这张
 
阅读(199)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017