live555源码分析----RSTPServer创建过程分析
最近五一回家,终于有机会能安静的看一下流媒体这方面相关的知识,准备分析live555的源码,接下来会把我读源码的过程记录成博客,以供其他的同路人参考。
因为再读源码的过程中,并不是一路顺着读下来,往往是读到后面,才能反过来明白之前读的内容,所以有的时候会写的有点穿越感。
在这个过程中,参考了其他大牛的博客,所以一些基本概念,就不再重复,也感谢前辈们的贡献。
五一在家条件不便,源码只好用截图方式给出。
下面进入正题:
我们观察live555MediaServer.cpp里的main函数,主要做了三件事:
1. 创建TaskScheduler和UsageEnvironment,一个用来做调度,一个代表运行的环境。
2. 创建一个DynamicRTSPServer,这个继承自RSTPServer对象。
3. 进入死循环,实际上是使用select来完成并发网络模型。
那这篇文章就是主要讲的创建一个DynamicRTSPServer到底发生了什么(即第二条),下面这张图是根据源码画出来的(能力有限,画的简陋),是创建一个DynamicRTSPServer过程中的重要函数调用关系:
下面挑重点讲一下:
DynamicRTSPServer继承自RTSPServer,所以构造DynamicRTSPServer也会构造其父类RTSPServer,RTSPServer构造函数如下:
其实核心代码就是调用turnOnBackgroundReadHandling函数,这个函数的代码如下:
再追踪:
这下就明了了,首先用assignHandler()把一些属性和server socket做一个绑定,其次就是使用FD_SET把这个server socket加入select的相应的集合,为接下来的select死循环做准备。
那么turnOnBackgroundReadHandling()的参数incomingConnectionHandlerRTSP又是什么鬼呢?上边说道,这个函数指针会和当前的socket被做一个绑定,所以当这个socket接收到数据的时候就会调用这个函数(这个以后会细说)。incomingConnectionHandlerRTSP经过层层调用,来到下面这个函数:
可以看到,server socket 进行accept操作就是在这一步进行的,也就是说初始的时候集合中只有一个server socket,当有客户端发起链接的时候,select调用返回,发现server socket发生了读操作,接下来便会调用注册了的incomingConnectionHandlerRTSP()函数,在这个函数里,依次调用accept()函数创建新的socket来与客户端进行通信。
incomingConnectionHandlerRTSP()里接下来会调用createNewClientSession(),一个RTSPClientSession代表着一条与客户端的链接。createNewClientSession()经过层层调用,会来到如下函数:
这下就全明了了,又是调用turnOnBackgroundReadHandling()函数,只不过参数从incomingConnectionHandlerRTSP函数指针变为了incomingRequestHandler,为什么呢,因为上一次我们调用这个函数是针对于server socket,server socket的主要功能是建立网络连接并分配新的socket和客户端进行会话。而这一次,我们是针对的socket是直接和客户端进行通话的socket,两种socket接收到数据时处理操作是不同的,所以绑定的函数也是不一样的。
这次绑定这个函数的内部结构是什么样的呢,经过调用来到如下函数:
简单的说就是使用readsock()从socket中读数据,使用handleRequstBytes()来对数据进行处理,比如客户端发过来了DESCRIBE或者SETUP等要分别怎么处理呢,就是在这个函数里进行的。
live555源码分析----RSTPServer创建过程分析的更多相关文章
- 1.live555源码分析----RSTPServer创建过程分析
最近五一回家,终于有机会能安静的看一下流媒体这方面相关的知识,准备分析live555的源码,接下来会把我读源码的过程记录成博客,以供其他的同路人参考. 因为再读源码的过程中,并不是一路顺着读下来,往往 ...
- u-boot 源码分析(1) 启动过程分析
u-boot 源码分析(1) 启动过程分析 文章目录 u-boot 源码分析(1) 启动过程分析 前言 配置 源码结构 api arch board common cmd drivers fs Kbu ...
- 干货分享之spring框架源码分析02-(对象创建or生命周期)
记录并分享一下本人学习spring源码的过程,有什么问题或者补充会持续更新.欢迎大家指正! 环境: spring5.X + idea 之前分析了Spring读取xml文件的所有信息封装成beanDef ...
- Disconf源码分析之启动过程分析下(2)
接上文,下面是第二次扫描的XML配置. <bean id="disconfMgrBean2" class="com.baidu.disconf.client.Dis ...
- Akka源码分析-Actor创建(续)
在上一遍博客中,我们已经分析了actor创建的大致过程,但只是涉及到了Dipatcher/Mailbox/ActorCell/InternalActorRef等对象的创建,并没有介绍我们自定义的继承A ...
- Akka源码分析-Actor创建
上一篇博客我们介绍了ActorSystem的创建过程,下面我们就研究一下actor的创建过程. val system = ActorSystem("firstActorSystem" ...
- Disconf源码分析之启动过程分析上(1)
Disconf的启动,主要是包括两次扫描和XML非注解式配置,总共分为上下两篇,上篇先主要介绍第一次静态扫描过程. 先从入口分析,通过Disconf帮助文档,可以看到xml必须添加如下配置. < ...
- live555源码分析
live555源代码下载(VC6工程):http://download.csdn.net/detail/leixiaohua1020/6374387 liveMedia 项目(http://www.l ...
- MVC源码分析 - Controller创建和创建扩展
上一篇, 出现了一个至关重要的类:MvcHandler, 接下来就来看一下MvcHandler吧. 先不看具体方法, 先看一下类里面的情况. //这里实现了两个重要的接口, 异步处理和同步处理的接口p ...
随机推荐
- 通过公钥解密密文思路(256bits RSA)
256bit RSA公钥安全系数极低,只需要几分钟即可破解密文,本文综合其他文章记录了一次解密256bits RSA加密的密文的过程,仅作为备忘. 1.分解公钥,分解出n与e: 1.1使用openss ...
- poj 2762 Going from u to v or from v to u?【强连通分量缩点+拓扑排序】
Going from u to v or from v to u? Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 15812 ...
- poj 1905 Expanding Rods(木杆的膨胀)【数学计算+二分枚举】
...
- Mybatis映射配置文件Mapper.xml详解
1.概述: MyBatis 的真正强大在于它的映射语句,也是它的魔力所在. 2.常用的属性 常用的几个属性: select元素:代表查询,类似的还有update.insert.delete id:这个 ...
- 堆栈在linux内存中的使用
链接:https://www.zhihu.com/question/57013926/answer/151506606 1.Linux 内核中使用 task_struct 作为进程描述符,该结构定义在 ...
- Struts2的<s:date>标签使用详解[转]
作用:用来格式化显示日期的格式. 它可以用一种你指定的格式来显示 (如:“yyyy-MM-dd”),可以生成通俗易懂的注释(如:in 2 hours,14 minutes),或者用预先定义的一个格式来 ...
- iOS定位和位置信息获取
要实现地图.导航功能,往往需要先熟悉定位功能,在iOS中通过Core Location框架进行定位操作.Core Location自身可以单独使用,和地图开发框架MapKit完全是独立的,但是往往地图 ...
- Spring data jpa 实现简单动态查询的通用Specification方法
本篇前提: SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法 这篇文章中的第二种方法 实现Specification 这块的方法 只适用于一个对象针对某一个固定字 ...
- nova Flavors
$ nova help | grep flavor- flavor-access-add Add flavor access for the given tenant. flavor-access-l ...
- 使用npm安装github仓库中的代码
我们在使用npm下载包的时候,一般是下载在npm官网发布过的.可以指定版本,指定依赖等等. 但是,对于一个团队或公司,需要从自己的工作账号拉取代码,npm是直接支持从git仓库安装的. 最近遇到的一个 ...