live555 rtsp服务器_Live555服务端程序简单解读3.docx

本文介绍了Live555 RTSP服务器的主要组件,包括BasicTaskScheduler、UsageEnvironment和RTSPServer。通过分析主程序,阐述了服务器启动过程,如任务调度、环境设置和套接字创建。还提到了类之间的关系,如继承和依赖,并探讨了程序的核心代码——基于select的IO复用和延时队列。尽管Live555的高并发处理能力有限,但文章鼓励读者深入研究其工作原理。
摘要由CSDN通过智能技术生成

服务器主程序

如下图,建议点开放大观看,先有个整体印象,细心的读者会发现包含的头文件格式为.hh,.hh 是为了区别 .h,作用只是为了区别而已,可忽略。

3892be381c1b02807ee43a9db8e43a60.png

这里面涉及类的关系错综复杂,但是官方为了方便我们理解其类之间的继承,依赖等关系提供了文档以及帮助说明,详情可点击以下网址:进行查阅。本文关系类截图也是来源于下面网址

http://www.live555.com/liveMedia/doxygen/html/annotated.html

http://www.live555.com/liveMedia/doxygen/html/classes.html

BasicTaskScheduler和BasicUsageEnvironment

Main函数里面前两行:

0eb068adc3120168fe60917cbb698590.png

这里是典型的一个多态,先把其关系结构图附上:

665c04f141eddbcf417b6967a410f832.png

0941d0fae8c6af8a8c83b6e2d960c38e.png

UsageEnvironment有个类成员, TaskScheduler& fScheduler;根据上述关系图印证二者的依赖关系。

BasicTaskScheduler 类中的 createNew()函数直接 new 了一个 BasicTaskScheduler 对象,默认传入的构造参数为

unsigned maxSchedulerGranularity=10000 毫秒

根据继承关系 BasicTaskScheduler0构造函数如下,先执行基类,而

c78ecc9dd726bd1a9456e7999b353dc4.png

继续看BasicTaskScheduler的构造函数:

e0e43e1beef87e8e3400740753d50b46.png

传入默认参数已经大于0,所以执行schedulerTickTask()

void BasicTaskScheduler::schedulerTickTask()

{

scheduleDelayedTask(fMaxSchedulerGranularity, schedulerTickTask, this);

}

而scheduleDelayedTask函数是在BasicTaskScheduler0类中实现,如下图:

9f0f31e42c04e676a8174a650b8aa2e6.png

注意参数里面的宏定义:

typedef void TaskFunc(void* clientData); 该宏定义意思是定义了一个函数指针 该指针指向的函数返回值为void 参数为(void* clientData)

typedef void* TaskToken;

scheduleDelayedTask第二个参数穿进去的就是个函数指针。

这个函数又涉及三个类,分别是DelayInterval ,AlarmHandler,DelayQueue。

DelayInterval

014147860a44414d4a4bc5a6a589d5ee.png

该类主要是时间相关的一些操作,这里先不深究了。

AlarmHandler:

92a8591b8d5f6c1f3040dbc57130d008.png

到这里要注意scheduleDelayedTask传进来的参数到了alarm里面的fProc和fClientData了。

DelayQueue:

5dced6b3c25c69c3fb4af5386ca6a328.png

15dbf137aa9bbf4a530e44adcf7fd68b.png

这里fDelayQueue调用addEntry的方法然后穿进去一个地址赋值给newEntry。

关于上面三个类的详细说明可以参考以下链接介绍:

AlarmHandler https://www.cnblogs.com/oloroso/p/4596870.html

DelayQueue https://www.cnblogs.com/oloroso/p/4596854.html

其中DelayQueue 为延时队列类,主要作用是为了实现单线程多并发。这里不再复述。进而,整个 BasicTaskScheduler::createNew()执行完毕,下面回到 main()函数中,执行如下语句:

UsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler);

构造函数如下:

a2cc8a604e1ef12688aaa76d0275aefc.png

回到main继续往下执行:

b28d9242e2d50388eedf1a648dd4bb8a.png

ec1b741ec046b99a23ba066577717106.png

简单查看该UserAuthenticationDatabase类为管理员的类,这边不重要先略过!

我们接着往下看!

e18038fa9754b57b34cabc1ee9643627.png

RTSPServer类:

0218a680eaca9487afd9e120f058dd2b.png

230f7305290bf139e6cae1288b5b1045.png

DynamicRTSPServer类:

这个类就比较重要了~~!准确的说这个类提供了RTSP的服务!

建议大家放大点开看看吧!~太复杂!!!!!!!!!这个关系我先不说了!!哪位高人说一下!

602f299274a04d95fe62de50476ac594.png

继续说这个函数~!这边应该建立了个套接字!

206df60570d34108e654e45bd212b525.png

然后构造

先看最上层的父类构造函数,注意参数env 那个是环境参数传进来了!

da4d7139e972875de45ad199ec488fe1.png

其次

3fe6c5864de6af1b2e4f2ae665b9df34.png

注意:从后面可以了解到,上面函数的最后一条语句的作用是,将 fRTSPServerSocket 添加到 Live555 的读监听描述符集,然后当有客户端发起连接时,系统获知,然后回调 incomingConnectionHandlerRTSP()函数。(正如其名称所示)

be9c73ce5e4b55ea152e684daf5d4590.png

继续看:

4a593615e20cb5c0074fce4f51459339.png

fHandlers 为 BasicTashScheduler0 的成员变量,类型为 HandlerSet,在其构造函数中创建。我们先看 HandlerSet
类的构造函数。

继续往下看在 RTSPServerSupportingHTTPStreaming 类的构造函数中,没有做具体实际的动作,略。

最后,在 DynamicRTSPServer 类的构造函数中,也没有做具体实际的动作。

回到主函数中,执行如下语句:

b01dee74c72340781204a7afac19b266.png

向屏幕输出相应的字符!

然后回到主函数,

19148d536f12019a6adeec9b46c1503f.png

启动了Live555的程序!

再研究下这个doEvenLoop!

f9c1faaaf6a68d4ad98d90b7c8678c47.png

e86daf60229182b8516e82750ea130c2.png

cc9bfdbea26523bbeda8b6209950a88d.png

上图中是整个程序的核心的代码~主要流程是select io复用然后从延时队列里面找相应的io事件~整个是单进程的操作!

其实我大概理了一下程序的流程,如果细细琢磨只能一行一行看了。而且该开源项目,类真的太多了!

e957df6e0496c995ec7ae9b5ad2de334.png

有兴趣的可以钻研下。

类的关系图附上,放大点击可以看下。

2cdbc608f6930c4168a3702a3b385d37.png

关于live555 项目客户端的解读楼主就不进行梳理了。大同小异,让我不解的是为什么服务器这么写~!这种写法原理上是无法实现高并发的操作的~!楼主愚见!由于本人水平不高希望读者多多评阅!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值