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-08-06 05:25:43

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

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

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

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

最近在回顾之前做过的相关项目,live555流媒体服务器也是其中之一,今天先把live555开源框架在Windows下的编译方法记录一下. live555是一套使用使用开放的标准协议(RTP/RTCP.RTSP.SIP)来处理多媒体流数据的开源C++库,使用LGPL协议.这些库可以编译为Unix(包括Linux和Mac OS X),Windows,和QNX(和其他POSIX系统)来构建流媒体应用.live555已经被用于如"Live555媒体服务器"和"live555代理服务

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

楼主用SQL Server 2012 在连接其他电脑的实例时,一直提示“已成功与服务器建立连接,但是在登录前的握手期间发生错误. (provider: SSL Provider, error: 0 - 等待的操作过时.” Google了很多资料,综合自己的问题,并参照官方问题介绍:http://support.microsoft.com/kb/2568167 和另外一位仁兄的博客http://blog.sina.com.cn/s/blog_728bc6a1010182ai.html整理解决方法如

webrtc学习笔记1(建立连接基本流程)

最近在做一个基于webrtc的视频软件,以下是自己对于上层建立通话连接流程的基本理解,记录于此. 假设A和B要建立视频通话,A为房间创建端,B为加入房间端: 1.A通过http登录.获取其他服务器地址(做一些保存用户信息的操作,获取信令.stun.turn服务器地址等,非必要) 2.A和信令服务器建立websocket长连接 3.A通过websocket向信令服务器注册(创建房间,记录房间号,等待B加入房间) 4.A创建本地视频,获取A的sdp信息 5.B创建本地视频,获取B的sdp信息 6.B

从头写rtsp服务器-RTSP协议的解析

rtps demo(linux是64位的,windows32位的):rtsp_demo.rar 1.首先服务器收到客户端连接请求,生产 一个RtspClientConnection对象,RtspClientConnection定义详见  从头写rtsp服务器-模块的划分 int rtsp::v_accept(netconnection * n) { netoperation::v_accept(n); printf("client accept\n\n\n"); RtspClientC

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

楼主用SQL Server 2012 在连接其他电脑的实例时,一直提示“已成功与服务器建立连接,但是在登录前的握手期间发生错误. (provider: SSL Provider, error: 0 - 等待的操作过时.” Google了很多资料,综合自己的问题,并参照官方问题介绍:http://support.microsoft.com/kb/2568167 和另外一位仁兄的博客http://blog.sina.com.cn/s/blog_728bc6a1010182ai.html整理解决方法如

raspberrypi 摄像头 rtsp服务器

1.获取树莓派的摄像头的视频源并且输出到 gstreamer中,并将数据传输到tcpserversink中,设定端口为5000 raspivid -t 0 -w 800 -h 600 -fps 25 -g 5 -b 4000000 -vf -n -o - | gst-launch-1.0 fdsrc ! h264parse ! gdppay ! tcpserversink host=127.0.0.1 port=5000 2.在gst-rtsp-server的example中test-launc

ssh免密码登陆 - 服务器建立信任关系

假设机器A,B,C,要建立A为主,可以免密码直接ssh进入B,C.操作如下: 假设只用用户yimr建立信任,则使用yimr用户登陆主机A,执行如下操作: 产生公钥和私钥 ssh-keygen -t rsa 然后,在/home/用户/.ssh目录下,产生id_rsa, id_rsa.pub文件 将公钥复制到BC节点 scp .ssh/id_rsa.pub B:/home/用户名/.ssh/A.pub 进入BC节点,将公钥放在authorized_keys文件中 cat .ssh/A.pub >>

SQL Server 2008 报错:已成功与服务器建立连接,但是在登录前的握手期间发生错误

今天SqlServer 2008连接数据库时报错:已成功与服务器建立连接,但是在登录前的握手期间发生错误.在连接到 SQL Server 2008 时,在默认的设置下 SQL Server 不允许远程连接可能会导致此失败. (provider: 命名管道提供程序, error: 0 - 管道的另一端上无任何进程. 刚开始以为是远程数据库的问题,试了一下,同事的机器能连上.说明是我本机问题了,然后连接本地数据库,也报同样的错误. 参考 http://friendship517.blog.163.c