DSS源码分析--对RTSP请求的状态机处理机制
来源:互联网 发布:卸妆 知乎 编辑:程序博客网 时间:2024/06/06 20:09
对RTSP Session进行管理的代码在Server.tproj/RTSPSession.cpp中。RTSPSession对象在构造函数中,首先将状态初始化为kReadingFirstRequest。
RTSPSession::RTSPSession( Bool16 doReportHTTPConnectionAddress ): RTSPSessionInterface(), fRequest(NULL), fRTPSession(NULL), fReadMutex(), fHTTPMethod( kHTTPMethodInit ), fWasHTTPRequest( false ), fFoundValidAccept( false), fDoReportHTTPConnectionAddress(doReportHTTPConnectionAddress), fCurrentModule(0), fState(kReadingFirstRequest){......}
RTSPSession::Run()实现了一个状态机,可以看其代码结构:
SInt64 RTSPSession::Run(){ …… while (this->IsLiveSession()) { switch (fState) { case kReadingFirstRequest: { …… if (err == QTSS_RequestArrived) fState = kHTTPFilteringRequest; if (err == E2BIG) fState = kHaveNonTunnelMessage; } continue; case kHTTPFilteringRequest: { fState = kHaveNonTunnelMessage; // assume it's not a tunnel setup message // prefilter will set correct tunnel state if it is. PreFilterForHTTPProxyTunnel(); …… } case kReadingRequest: { …… fState = kHaveNonTunnelMessage; } case kHaveNonTunnelMessage: { …… fState = kFilteringRequest; } case kFilteringRequest: { …… if (fRequest->HasResponseBeenSent()) { fState = kPostProcessingRequest; break; } fState = kRoutingRequest; } case kRoutingRequest: { …… if(fRequest->SkipAuthorization()) { fState = kPreprocessingRequest; …… } else fState = kAuthenticatingRequest; } case kAuthenticatingRequest: { …… if (fRequest->HasResponseBeenSent()) { fState = kPostProcessingRequest; break; } fState = kAuthorizingRequest; } case kAuthorizingRequest: { if (fRequest->HasResponseBeenSent()) { fState = kPostProcessingRequest; break; } fState = kPreprocessingRequest; } case kPreprocessingRequest: { …… if (fRequest->HasResponseBeenSent()) { fState = kPostProcessingRequest; break; } fState = kProcessingRequest; } case kProcessingRequest: { …… fState = kPostProcessingRequest; } case kPostProcessingRequest: { …… fState = kSendingResponse; } case kSendingResponse: { …… fState = kCleaningUp; } case kCleaningUp: { …… fState = kReadingRequest; } } } ……}
对于第一次RTSP请求,在kReadingFirstRequest中,如果收到完整的RTSP请求,会转入kHTTPFilteringRequest。在kHTTPFilteringRequest状态,会通过PreFilterForHTTPProxyTunnel()检查这个RTSP请求是否通过HTTP Tunnel。如果是普通的RTSP请求,则进入kHaveNonTunnelMessage状态;如果是走HTTP POST,则进入kSocketHasBeenBoundIntoHTTPTunnel状态;如果是走HTTP GET,则进入kReadingRequest状态。
对于后续的RTSP请求,则直接进入kReadingRequest状态。(第一次RTSP请求结束后,状态被置为kReadingRequest。)
在kReadingRequest状态,确保收到完整的RTSP请求数据后,进入kHaveNonTunnelMessage状态。
在kHaveNonTunnelMessage状态,生成RTSPRequest对象,检查RTSP请求数据的正确性,进入kFilteringRequest状态。
在kFilteringRequest状态,会调用所有注册了QTSS_RTSPFilter_Role角色的模块,随后进入kRoutingRequest状态。
在kRoutingRequest状态,会调用所有注册了QTSS_RTSPRoute_Role角色的模块,然后判断是否需要进行认证,分别进入kAuthenticatingRequest和kPreprocessingRequest状态。
kAuthenticatingRequest状态要解决的问题是:用户是不是这个系统的合法用户。若是合法用户,则进入kAuthorizingRequest状态,这里会解决另一个问题:用户对要访问的资源是否真的有权限。
对RTSP请求的真正处理放在kProcessingRequest阶段,而其前后则有预处理kPreprocessingRequest阶段和后处理kProcessingRequest阶段。然后进入kSendingResponse阶段发回数据,再进入kCleaningUp阶段做清理工作,最后把状态设为kReadingRequest准备处理下一个RTSP请求。
认证通过以后,RTSP请求的状态会在kReadingRequest->kHaveNonTunnelMessage->kFilteringRequest->kRoutingRequest->kPreprocessingRequest->kProcessingRequest->kPostProcessingRequest->kSendingResponse->kCleaningUp->kReadingRequest
- DSS源码分析--对RTSP请求的状态机处理机制
- DSS源码分析--RTSP请求的认证机制
- memcached 源码分析之请求处理(状态机)
- Lighttpd1.4.20源码分析 笔记 状态机之请求处理
- DSS源码分析
- DSS源码分析
- Mvc对请求的处理机制
- DSS 代码分析【RTSP消息交互过程】
- DSS 代码分析【点播请求】
- struts2的请求处理过程源码分析
- struts2的请求处理过程源码分析
- struts2的请求处理过程源码分析
- dss源码分析1:OSMutex
- DSS转发手机rtsp的构想
- Android的消息处理机制源码分析
- AsyncTask处理机制的源码分析
- DSS 代码分析【RTSP announce推流报文分析】
- OpenSceneGraph源码分析——OSG状态机如何处理传入的渲染状态(StateSet)数据
- COM学习:delete pIUnknown时异常与IUnknown顺序
- We have a Python
- Mysql中文乱码问题完美解决方案
- Matlab中arrayfun函数
- uva 10479 - The Hendrie Sequence(规律+递归)
- DSS源码分析--对RTSP请求的状态机处理机制
- 使用OpenSSL API安全编程
- 吴立德教授深度学习课程笔记
- Java对文件和文件夹操作的一些方法
- mysql5.1.51在嵌入式开发板上的移植总结
- 通用网络信息采集器(爬虫)设计方案
- JAVA面向接口的编程思想与具体实现
- 曾参阅的博客链接
- vmware 在win7无法桥接到无线网卡的原因