博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
live555 RTSP服务器建立及消息处理流程
阅读量:6261 次
发布时间:2019-06-22

本文共 2645 字,大约阅读时间需要 8 分钟。

DynamicRTSPServer::creatnew():

    1.调用继承自RTPSever::setUpOurSocket:
        1.调用 GroupsockHelper 的 setupStreamSocket创建一个socket连接,并绑定,
        2.设置socket的发送缓存大小,
        3.调用listen开始监听端口,设置同时最大能处理连接数 LISTEN_BACKLOG_SIZE=20,如果达到这个上限则client端将收到ECONNERREFUSED的错误
        4.测试绑定端口是否为0,为0的话重新绑定断口,并返回系统自己选择的新的端口。
        5.返回建立的socket文件描述符

    2.调用自己和RTPSever的构造函数:

    RTPSever构造函数:
        1.用一个UsageEnvironment对象的引用构造其父类Medium
        2.设置最大等待回收连接时间 reclamationTestSeconds ,超过这个时间从客户端没有RTSP命令或者RTSP的RR包则收回其RTSPClientSession
        3.建立一个HashTable[实际上是一个BasicHashTable], fServerMediaSessions指向这个表。
        4.调用参数UsageEnvironment对象env的成员,一个TaskScheduler指针所指对象[实际就是一个BasicTaskScheduler 对象]的成员函数
            turnOnBackgroundReadHandling():
                1.调用一个HandlerSet::assignHandler()创建一个Handler,把socketNum[此处为服务器监听的socket描述符]和处理函数RTSPServer::incomingConnectionHandler(),还有指向RTSPSever的指针绑定在一起。
                    incomingConnectionHandler作用:
                        1.调用accept返回服务器与客户端连接的socket描述符
                        2.设置客户端描述符为非阻塞
                        3.增加客户端socket描述符的发送缓存为50*1024
                        4.为此客户端随机分配一个sessionId
                        5.用客户端socket描述符clientSocket,sessionId,和客户端地址clientAddr调用creatNewClientSession创建一个clientSession。

RTSPClientSession::RTSPClientSession()构造函数:
    1.重置请求缓存

    2.调用envir().taskScheduler().turnOnBackgroundReadHandling(),这次socket number 为客户端socket描述符这次的处理函数是RTSPServer::RTSPClientSession::incomingRequestHandler()

        RTSPServer::RTSPClientSession::incomingRequestHandler():

            调用handleAlternativeRequestByte1(uint8_t requestByte):
                1.fRequestBuffer[fRequestBytesAlreadySeen] = requestByte;把请求字符放入请求缓存fRequestBuffer
               
                2.调用handleRequestBytes(1) 处理请求缓存
                    handleRequestBytes(int newBytesRead):
                        1.调用noteLiveness()查看请求是否到期,如果服务器的reclamationTestSeconds > 0,调用taskScheduler对象的rescheduleDelayedTask
函数: 参数为( fLivenessCheckTask,  fOurServer.fReclamationTestSeconds*1000000, (TaskFunc*)livenessTimeoutTask,  this )
其中livenessTimeoutTask()函数作用是删除new出来的clientSession.
                            1.调用unscheduleDelayedTask(TaskToken& prevTask):
                                从DelayQueue中删除prevTask项, prevTask置空.
                            2.调用scheduleDelayedTask(int64_t microseconds, TaskFunc* proc, void* clientData):
                                1.创建一个DelayInterval对象timeToDelay,用microseconds初始化。
                                2.创建一个AlarmHandler对象,用proc, clientData, timeToDelay初始化
                                3.调用fDelayQueue.addEntry(),把这个AlarmHandler对象加入到延迟队列中
                                4.返回AlarmHandler对象的token[long类型]的指针
                         2.如果请求的的长度超过请求缓存可读长度fRequestBufferBytesLeft,结束这个连接。

                3.找到请求消息的结尾:<CR><LF><CR><LF>。

                4.如果找到消息结尾,调用RTSPServer::RTSPClientSession::handleRequestBytes()[值得关注此函数]把请求字符串转换成命令各部分包括:cmdName[方法],urlPreSuffix[url地址],urlSuffix[要读取的文件名],sceq[消息的Cseq],否则函数返回需要继续从连接中读取请求。分别存入对 应的数组。

                5.如果转换成功,调用handleCmd_xxx()处理对应的cmdName: xxx [此处实现了:OPTIONS,DESCRIBE,SETUP,TEARDOWN,PLAY,PAUSE,GET_PARAMETER,SET_PARAMETER]

                其中PLAY,PAUSE,GET_PARAMETER,SET_PARAMETER 调用handleCmd_withinSession(cmdName,urlPreSuffix, urlSuffix, cseq,(char const*)fRequestBuffer);

                6.清空 RequestBuffer.

转载地址:http://knqsa.baihongyu.com/

你可能感兴趣的文章
flash 曲线部分
查看>>
微软2016校园招聘在线笔试 B Professor Q's Software [ 拓扑图dp ]
查看>>
一对一直播源码VS短视频源码 是旗鼓相当还是天渊之别
查看>>
面试题记录 持续更新中.....
查看>>
什么是云原生架构
查看>>
lottie动画设计_免异常总结
查看>>
Python PyCharm编辑器配置和使用
查看>>
SpringCloud学习之路(五) - 断路器(Hystrix)
查看>>
17. IntelliJ IDEA + Maven创建Java Web项目
查看>>
javascript中的后退和刷新
查看>>
JSTL详解--Core 标签库介绍
查看>>
简谈http状态码
查看>>
Binary Search(Java)(非递归)
查看>>
Access2007数据库下载地址与AccessHelper
查看>>
git 常用命令
查看>>
iphone-common-codes-ccteam源代码 CCNetwork.h
查看>>
winform 写app。config
查看>>
Android中使用ShareSDK实现分享
查看>>
LoadRunner中响应时间与事物时间详解
查看>>
Numba——python面向数组高性能计算库
查看>>