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 ...
随机推荐
- linux+udp+server+client
一.客户端 #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include ...
- Linux下解压分包文件zip(zip/z01/z02)
分包压缩的zip文件不能被7z解压,且这种格式是Windows才能创建出来,在Linux下不会以这种方式去压包.下面是在Linux下处理这种文件的做法: 方法一: cat xx.z01 xx.zip ...
- struts2 if标签示例[转]
下面总结一下struts2 中if标签的使用 (1)判断字符串是否为空 <s:if test="user.username==null or user.username==''&quo ...
- C语言下文件目录查看
C语言下文件目录遍历通常会用到下面这些函数 _access() /* 判断文件或文件夹路径是否合法 */ _chdir() /* 切换当前工作目录 */ _findfirst() / ...
- DS 和【ADDRESS】学习记录
CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址. 内存单元由2部分组成. 8086CPU中,内存地址由以下组成. 1:段地址 2:偏移地址 8086CPU中,有一个DS寄存器地址,通常用 ...
- JDBC批量插入blob数据
图片从接口读取后是base64的字符串,所以转成byte数组进行保存. 我们一般保存数据的话,都是基本数据,对于这些图片数据大部分会将图片保存成Blob,Clob等. Blob存储的是二进制对象数据( ...
- SQL Server集成服务最佳实践:语句优化
SQL Server集成服务(SQL Server Integration Services,SSIS)在其前辈DTS(Data Transformation Services,数据转换服务) ...
- 直方图均衡化的 C++ 实现(基于 openCV)
这是数字图像处理课的大作业,完成于 2013/06/17,需要调用 openCV 库,完整源码和报告如下: #include <cv.h> #include <highgui.h&g ...
- mac系统卸载mono
官方页面:http://www.mono-project.com/docs/about-mono/supported-platforms/osx/#uninstalling-mono-on-mac-o ...
- Github 配置 SSH
HTTPS方式管理的直接输入登录用户名和密码就可以.下面介绍SSH的方式. mac系统为例,官方ssh参考:https://help.github.com/articles/generating-ss ...