最近五一回家,终于有机会能安静的看一下流媒体这方面相关的知识,准备分析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. 【JavaScript】JavaScript中的ActiveXObject对象

    JavaScript中ActiveXObject对象是启用并返回 Automation 对象的引用.    使用方法: newObj = new ActiveXObject( servername.t ...

  2. ios兼容性收集整理

    1. ios系统兼input输入框光标问题 异常现象:苹果手机文本输入框样式异常——光标聚焦到文本框,光标高度充满文本框,输入内容,光标高度为文本框上边框到输入内容底部: 光标聚焦: 输入内容: 异常 ...

  3. fragment原来的页面切换被重新实例化,无法继续保持上一次的内容。只让它执行一次

    最好的方法是: 定义类.静态变量的方式 保存数据,从这里取. 用网上其他人的方法,fragment切换速度太快会报错 child view 没有从parent view 中移除: 只执行一次,定义一个 ...

  4. matlab学习笔记12_2创建结构体数组,访问标量结构体,访问非标量结构体数组的属性,访问嵌套结构体中的数据,访问非标量结构体数组中多个元素的字段

    一起来学matlab-matlab学习笔记12 12_2 结构体 创建结构体数组,访问标量结构体,访问非标量结构体数组的属性,访问嵌套结构体中的数据,访问非标量结构体数组中多个元素的字段 觉得有用的话 ...

  5. (转载)理解Spatial Transformer Networks

    理解Spatial Transformer Networks 转载于:知乎-SIGAI 书的购买链接 书的勘误,优化,源代码资源 获取全文PDF请查看:理解Spatial Transformer Ne ...

  6. 【转】kettle7.1资源库无法打开,找不到connect按钮的问题处理

    转自:https://www.aboutyun.com/home.php?mod=space&uid=71645&do=blog&id=3535 kettle是一个比较好用的E ...

  7. ros 源码安装

    版本lunar, 系统版本debian 9.8 参考: http://wiki.ros.org/lunar/Installation/Source 1. Installing bootstrap de ...

  8. WinSCP-windows与Linux之间文件传输

    WinSCP是一款Windows下通过使用SSH协议的开源工具,用于连接Linux操作系统,可以上传或者下载文件使用! 开源顾名思义,无需注册,安装即可使用!(安装请自行百度WinSCP) 打开桌面上 ...

  9. Java 8并行流的性能陷阱

    并行化流被分成多个块,每个块独立处理,结果在最后汇总. CPU密集型代码如下: private long countPrimes(int max) {     return range(1, max) ...

  10. 【Docker学习之七】Docker图形化管理和监控

    环境 docker-ce-19.03.1-3.el7.x86_64 centos 7 一.Docker管理工具 (官方三剑客)1.Docker Machine(学习的Openstack Heat)Cr ...