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. C++/C# 最基本的Marshal和Ptr

    Vidyo32.VidyoClientInEventLogin Login = new Vidyo32.VidyoClientInEventLogin(); Login.portalUri = thi ...

  2. BZOJ 2301: [HAOI2011]Problem b( 数论 )

    和POI某道题是一样的...  http://www.cnblogs.com/JSZX11556/p/4686674.html 只需要二维差分一下就行了. 时间复杂度O(MAXN + N^1.5) - ...

  3. JS计算两个日期相差几天

    function Computation(sDate1, sDate2){ var aDate, oDate1, oDate2, iDays aDate = sDate1.split("-& ...

  4. poj 1966 Cable TV Network 顶点连通度

    题目链接 给一个图, n个点m条边, 求至少去掉多少个点可以使得图不再联通.随便指定一个点为源点, 枚举其他点为汇点的情况, 跑网络流, 求其中最小的情况. 如果最后ans为inf, 说明是一个完全图 ...

  5. Nancy之实现API

    Nancy之实现API的功能 0x01.前言 现阶段,用来实现API的可能大部分用的是ASP.NET Web API或者是ASP.NET MVC,毕竟是微软官方出产的,用的人也多. 但是呢,Nancy ...

  6. Y5V贴片电容(MLCC)容量范围速查表

    Y5V贴片电容简述 Y5V贴片电容属于EIA规定的Class 2类材料的电容.它的电容量受温度.电压.时间变化影响大. Y5V贴片电容特性 具有较差的电容量稳定性,在-25℃-85℃工作温度范围内,温 ...

  7. Html 小插件9 腾讯新闻

    地址:http://minisite.qq.com/others08/ 效果:

  8. BZOJ 4503 两个串(FFT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4503 [题目大意] 给出S串和T串,计算T在S中出现次数,T中有通配符'?'. [题解 ...

  9. zzbank oneOpencloud Env linuxaix6.1 interactiveMaintain(nfs,aix genintall基于系统iso光盘,aix6.1 puppet-Agent,Cent6.4 puppetServer,agent time no syn case Er)

    1,puppet--server,Client,Agent time no syn case eror puppet agent --server frontend -terr: Could not ...

  10. C模块回调Lua函数的两种方法

    作者:ani_di 版权所有,转载务必保留此链接 http://blog.csdn.net/ani_di C模块回调Lua函数的两种方法 lua和C通过虚拟栈这种交互方式简单而又可靠,缺点就是C做栈平 ...