最近五一回家,终于有机会能安静的看一下流媒体这方面相关的知识,准备分析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等要分别怎么处理呢,就是在这个函数里进行的。

1.live555源码分析----RSTPServer创建过程分析的更多相关文章

  1. live555源码分析----RSTPServer创建过程分析

    最近五一回家,终于有机会能安静的看一下流媒体这方面相关的知识,准备分析live555的源码,接下来会把我读源码的过程记录成博客,以供其他的同路人参考. 因为再读源码的过程中,并不是一路顺着读下来,往往 ...

  2. u-boot 源码分析(1) 启动过程分析

    u-boot 源码分析(1) 启动过程分析 文章目录 u-boot 源码分析(1) 启动过程分析 前言 配置 源码结构 api arch board common cmd drivers fs Kbu ...

  3. 干货分享之spring框架源码分析02-(对象创建or生命周期)

    记录并分享一下本人学习spring源码的过程,有什么问题或者补充会持续更新.欢迎大家指正! 环境: spring5.X + idea 之前分析了Spring读取xml文件的所有信息封装成beanDef ...

  4. Disconf源码分析之启动过程分析下(2)

    接上文,下面是第二次扫描的XML配置. <bean id="disconfMgrBean2" class="com.baidu.disconf.client.Dis ...

  5. Akka源码分析-Actor创建(续)

    在上一遍博客中,我们已经分析了actor创建的大致过程,但只是涉及到了Dipatcher/Mailbox/ActorCell/InternalActorRef等对象的创建,并没有介绍我们自定义的继承A ...

  6. Akka源码分析-Actor创建

    上一篇博客我们介绍了ActorSystem的创建过程,下面我们就研究一下actor的创建过程. val system = ActorSystem("firstActorSystem" ...

  7. Disconf源码分析之启动过程分析上(1)

    Disconf的启动,主要是包括两次扫描和XML非注解式配置,总共分为上下两篇,上篇先主要介绍第一次静态扫描过程. 先从入口分析,通过Disconf帮助文档,可以看到xml必须添加如下配置. < ...

  8. live555源码分析

    live555源代码下载(VC6工程):http://download.csdn.net/detail/leixiaohua1020/6374387 liveMedia 项目(http://www.l ...

  9. MVC源码分析 - Controller创建和创建扩展

    上一篇, 出现了一个至关重要的类:MvcHandler, 接下来就来看一下MvcHandler吧. 先不看具体方法, 先看一下类里面的情况. //这里实现了两个重要的接口, 异步处理和同步处理的接口p ...

随机推荐

  1. HandlerMethodArgumentResolver SpringMVC 参数解析 继承关系以及各解析器解析类型

    HandlerMethodArgumentResolver SpringMVC 参数解析 继承关系以及各解析器解析类型 I HandlerMethodArgumentResolver (org.spr ...

  2. SpringBoot Aop打印参数

    import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; import lombok.extern.slf ...

  3. 安装opencv时ippicv下载超时

    1.手动去下载: github地址为: https://github.com/opencv/opencv_3rdparty/tree/ippicv/master_20151201/ippicv 2.查 ...

  4. python自动化接口测试

    前几天,同组妹子说想要对接口那些异常值进行测试,能否有自动化测试的方法.仔细想了一下,工具还挺多,大概分析了一下: 1.soapui:可以对接口参数进行异常值参数化,可以加断言,一般我们会加httpc ...

  5. 【链接】在线压缩JS文件

    在线压缩JS文件: http://yui.2clics.net/ https://refresh-sf.com/

  6. 🐯 php项目中类的自动加载

    主要函数:spl_autoload_register() — 注册给定的函数作为 __autoload() 的实现 将函数注册到SPL __autoload函数队列中.如果该队列中的函数尚未激活,则激 ...

  7. java学习摘抄笔记mybaits2

    mybatis第二天  高级映射 查询缓存 和spring整合 课程复习: mybatis是什么? mybatis是一人持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己去编 ...

  8. 【Docker学习之一】初始Docker

    一.云计算的概念 PaaS(Platform-as-a-Service:平台即服务),把应用服务的运行和开发环境作为一种服务.SaaS(Software-as-a-Service),意思为软件即服务, ...

  9. IDEA和JIRA任务联动(redmine同理)

    IDEA和JIRA任务联动-操作流程详解 redmine和这个步骤类似,只是第一步选择的工具不一样 操作流程 添加jira配置,File->Setting-->tools-->Tas ...

  10. How long does it take to make a context switch?

    FROM: http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html That's a interesti ...