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.

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

  1. live555从RTSP服务器读取数据到使用接收到的数据流程分析

    本文在linux环境下编译live555工程,并用cgdb调试工具对live555工程中的testProgs目录下的openRTSP的执行过程进行了跟踪分析,直到将从socket端读取视频数据并保存为 ...

  2. (转)live555从RTSP服务器读取数据到使用接收到的数据流程分析

    本文在linux环境下编译live555工程,并用cgdb调试工具对live555工程中的testProgs目录下的openRTSP的执行过程进行了跟踪分析,直到将从socket端读取视频数据并保存为 ...

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

    1,RTSP连接的建立过程    RTSPServer类用于构建一个RTSP服务器,该类同时在其内部定义了一个RTSPClientSession类,用于处理单独的客户会话.    首先创建RTSP服务 ...

  4. 【VS开发】【Live555-rtsp】RTSP服务器实例live555源代码分析

    原文地址:RTSP服务器实例live555源代码分析作者:mozheer 1. RTSP连接的建立过程 RTSPServer类用于构建一个RTSP服务器,该类同时在其内部定义了一个RTSPClient ...

  5. 庖丁解牛-----Live555源码彻底解密(根据MediaServer讲解Rtsp的建立过程)

    live555MediaServer.cpp服务端源码讲解 int main(int argc, char** argv) { // Begin by setting up our usage env ...

  6. 从零开始写一个发送h264的rtsp服务器(上)

    转自:http://blog.csdn.net/jychen105/article/details/47006345 一.什么是RTSP 通常所说的rtsp协议其实包含三个协议: rtsp协议, rt ...

  7. Live555流媒体服务器编译(Windows下)

    最近在回顾之前做过的相关项目,其中包括live555流媒体服务器相关,今天先把live555开源框架在Windows下的编译方法记录一下. live555是一套使用使用开放的标准协议(RTP/RTCP ...

  8. 已成功与服务器建立连接,但是在登录前的握手期间发生错误。 (provider: SSL Provider, error: 0 - 等待的操作过时)

    今天忽然间发现远程连接别人数据库会出现  已成功与服务器建立连接,但是在登录前的握手期间发生错误. (provider: SSL Provider, error: 0 - 等待的操作过时)  这种情况 ...

  9. SQLServer 2012 已成功与服务器建立连接,但是在登录前的握手期间发生错误。 (provider: SSL Provider, error: 0 - 等待的操作过时。

    楼主用SQL Server 2012 在连接其他电脑的实例时,一直提示“已成功与服务器建立连接,但是在登录前的握手期间发生错误. (provider: SSL Provider, error: 0 - ...

随机推荐

  1. 跟我一起学写jQuery插件开发方法(转载)

    jQuery如此流行,各式各样的jQuery插件也是满天飞.你有没有想过把自己的一些常用的JS功能也写成jQuery插件呢?如果你的答案是肯定的,那么来吧!和我一起学写jQuery插件吧!     很 ...

  2. asp.net、html、javascript等比较有用的网站

    Learn模块下web.mvc.razor等. http://www.asp.net/ 包括html.javascript.jquery.xml等教程. http://www.w3school.com ...

  3. Oracle操作数据库oracleHelper

    1 Oracle OracleHelper //============================================================================ ...

  4. Ubuntu的快捷键

    正如大家都知道的那样,Ubuntu的终端的Terminal能快捷的操作该linux系统,减少鼠标的使用.(vim党,尽量避免使用鼠标) 在Ubuntu中,终端的快捷键为(大小写无关的): Ctrl + ...

  5. Hadoop学习之Hadoop集群搭建

    1.检查网络状况 Dos命令:ping ip地址,同时,在Linux下通过命令:ifconfig可以查看ip信息2.修改虚拟机的ip地址    打开linux网络连接,在桌面右上角,然后编辑ip地址, ...

  6. 利用Comparator排序

    import java.util.Comparator; class Studentxx {     private String nameString;     private int age;   ...

  7. MySQL 设置数据库的隔离级别

    在会话级别设置隔离级别 1.read commited :set session transaction isolation level read committed; 2.repeatable re ...

  8. 转: git常用命令

    # git配置 #---------------------------------------------- #配置用户名和邮箱: $ git config --global user.name & ...

  9. NYOJ 527 AC_mm玩dota

    AC_mm玩dota 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 大家都知道AC_mm比较喜欢玩游戏,特别是擅长war3这款经典游戏.某天AC_mm来到了VS平台上 ...

  10. 深度优先搜索算法(DFS)以及leetCode的subsets II

    深度优先搜索算法(depth first search),是一个典型的图论算法.所遵循的搜索策略是尽可能“深”地去搜索一个图. 算法思想是: 对于新发现的顶点v,如果它有以点v为起点的未探测的边,则沿 ...