live555 RTSP服务器建立及消息处理流程

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.

时间: 2024-10-30 03:02:27

live555 RTSP服务器建立及消息处理流程的相关文章

live555学习之RTSP连接建立以及请求消息处理过程

1,RTSP连接的建立过程     RTSPServer类用于构建一个RTSP服务器,该类同时在其内部定义了一个RTSPClientSession类,用于处理单独的客户会话.     首先创建RTSP服务器(具体实现类是DynamicRTSPServer),在创建过程中,先建立Socket(ourSocket)在TCP的554端口进行监听,然后把连接处理函数句柄  (RTSPServer:: incomingConnectionHandler)和socket句柄传给任务调度器(taskSched

live555 rtsp vlc-请问如何用live555搭建RTSP服务器,并使用VLC播放

问题描述 请问如何用live555搭建RTSP服务器,并使用VLC播放 如题,我的系统是win7 64位,怎么用live555搭建RTSP服务器,视频源是本地视频文件 ,请问如何实现.请各位大神指点 解决方案 http://blog.sina.com.cn/s/blog_80be40500101euo7.html 解决方案二: http://download.csdn.net/detail/yong_hen/8165971 解决方案三: 使用VLC和live555MediaServer搭建RTS

对Outlook 2010进行自动答复设置时提示无法与服务器建立连接

最近在对Outlook 2010进行自动答复设置时,提示无法与服务器建立连接,当时感觉非常地奇怪,白天还好好地,回家邮件收发也正常,登录OWA查看可以正常收发邮件正常,配置外出提醒也是正常的,检查Exchange Server 服务器日志也是正常的,这是为什么呢? 于是开始尝试删除outlook 2010配置文件,想看看是否是由于配置文件导致的. 删除配置文件后,重新配置,新的问题又出现了,提示找不到Exchange Server 服务器,如下图提示: 尝试手动重新输入Exchange Serv

用户如何与Oracle数据库服务器建立连接

用户要想使用Oracle数据库,首先要与数据库建立连接.针对数据库连接,Oracle提供了两种解决方式:专用连接和共享连接. 大部分情况下,我们使用专用连接方式.对专用连接来说,用户在客户端启动了一个应用程序,比如SQL*Plus,于是就在客户端本地启 动了一个用户进程.与Oracle服务器成功建立连接以后,就会在数据库服务器端生成一个对应的服务器进程,该服务器进程作为用户进程 的代理 进程,也叫影子进程,从而代替客户端去执行各种命令并将结果返回.也就是说,用户在客户端输入的各种命令,都是通过位

已成功与服务器建立连接但是在登录过程中发生错误的解决

  已成功与服务器建立连接,但是在登录过程中发生错误的解决方案 数据库一打开就提示 已成功与服务器建立连接,但是在登录过程中发生错误的解决方案 (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程.) 解决办法: 1.应该是服务器上没有开启管道支持,看到网上有人有同样问题,远程桌面进SQL Server服务器上试一下: 打开'程序'-'所有程序'-'Microsoft SQL Server 2005 '-'配置工具'-'SQL Server 配置管理器',在弹

linux服务器建立共享目录

问题描述 如何在linux服务器建立共享目录,比如输入内网ip "\192.168.0.6"就能打开那个共享目录,可以下载一些软件或者上传软件? 解决方案 samba

java应用端RTSP服务器?谁有.dll和手册?或则谁有.jar和手册?

问题描述 java应用端RTSP服务器?谁有.dll和手册?或则谁有.jar和手册? 最近小弟在做流媒体,BOSS说在java应用端做个RTSP的服务器.头会接触,不知道各位有没有谁做过这玩意.在网上查找资料貌似没发现用java做的.java博大精深,总有个把子解决办法吧???所以,在这看看有没有共享资源的,如有.dll或则.jar还望共享下(没对应的手册或者基本的使用文档的也就算了). 解决方案 Red5的主要功能和Macromedia公司的FMS类似,提供基于Flash的流媒体服务的一款基于

VS2010连接数据库:已成功与服务器建立连接,但是在登录过程中发生异常

问题描述 VS2010连接数据库:已成功与服务器建立连接,但是在登录过程中发生异常 数据库确定没问题,服务器数据库其他人也可以连接正常使用,但是,我的VS2010连接的时候出现了这样的提示... 解决方案 看错误是超时 了,难道网络速度太慢了? 解决方案二: ssl握手错误,超时了 解决方案三: 先用你自己电脑连接对方sqlserver看有没有问题吧

跨服务器同步-如何实现跨服务器建立视图?

问题描述 如何实现跨服务器建立视图? 我现在有两个数据库服务器,一个Sql Server的,还有一个Oracle的然后,我想从Oracle的服务器下检索数据,并在Sql Server的数据库下建立一个视图,呈现这些数据,实现数据的同步.求可行的方法,可以帮我实现这个想法~ 解决方案 我是用Navicat Premium在操作这两个数据库的