live555学习笔记15-RTCPInstance类小结
来源:互联网 发布:杨霞sunny扒皮知乎 编辑:程序博客网 时间:2024/06/05 05:46
RTCPInstance是对rtcp通信的封装.RTCP主要是功能是统计包的收发为流量控制提供依据.RTCPInstance统计数据的取得仅依赖于RTPSink的一些函数(因为RTPSink发送RTP包),所以RTCPInstance与其它类(GroupSock,RTPInterface等基础类除外)基本关系不大,封装的比较完整.
RTCPInstance靠RTPInterface提供网络通讯支持,所以它既支持rtcp over udp,又支持rtcp over tcp.
RTCPInstance接收到的包在函数static void incomingReportHandler(RTCPInstance* instance, int /*mask*/)中处理.
最值得关注的是这个成员函数:void setSpecificRRHandler(netAddressBits fromAddress, Port fromPort,TaskFunc* handlerTask, void* clientData).它的作用是让调用者可以设置回调函数,调用者就可以在收到RR包时做出一定的动作.参数fromAddress和fromPort指明要对哪个客户端的RR包做出响应.
利用这个机制的例子是RTSPServer::RTSPClientSession.它会把自己的RRHandler函数经过层层传递,最终传给RTCPInstance.于是RTSPServer::RTSPClientSession就可以在每次收到对应的客户端的RR包时调用它传入的函数,这个函数是void RTSPServer::RTSPClientSession::noteClientLiveness(RTSPClientSession* clientSession).此函数只是以下函数的过渡:
- void RTSPServer::RTSPClientSession::noteLiveness()
- {
- #ifdef DEBUG
- fprintf(stderr, "Liveness indication from client at %s\n", our_inet_ntoa(fClientAddr.sin_addr));
- #endif
- if (fOurServer.fReclamationTestSeconds > 0) {
- envir().taskScheduler().rescheduleDelayedTask(fLivenessCheckTask,
- fOurServer.fReclamationTestSeconds * 1000000,
- (TaskFunc*) livenessTimeoutTask, this);
- }
- }
void RTSPServer::RTSPClientSession::noteLiveness(){#ifdef DEBUGfprintf(stderr, "Liveness indication from client at %s\n", our_inet_ntoa(fClientAddr.sin_addr));#endifif (fOurServer.fReclamationTestSeconds > 0) {envir().taskScheduler().rescheduleDelayedTask(fLivenessCheckTask,fOurServer.fReclamationTestSeconds * 1000000,(TaskFunc*) livenessTimeoutTask, this);}}
可以看到,每收到一次指定客户端的RR包,就重置一下livenessTimeoutTask()的运行时间,如果livenessTimeoutTask()一旦运行,看一下livenessTimeoutTask():
- void RTSPServer::RTSPClientSession::livenessTimeoutTask(RTSPClientSession* clientSession)
- {
- // If this gets called, the client session is assumed to have timed out,
- // so delete it:
- #ifdef DEBUG
- fprintf(stderr, "RTSP client session from %s has timed out (due to inactivity)\n", our_inet_ntoa(clientSession->fClientAddr.sin_addr));
- #endif
- delete clientSession;
- }
void RTSPServer::RTSPClientSession::livenessTimeoutTask(RTSPClientSession* clientSession){// If this gets called, the client session is assumed to have timed out,// so delete it:#ifdef DEBUGfprintf(stderr, "RTSP client session from %s has timed out (due to inactivity)\n", our_inet_ntoa(clientSession->fClientAddr.sin_addr));#endifdelete clientSession;}
那么RTSPServer::RTSPClientSession就会自杀(真是想不开啊).也就是说fOurServer.fReclamationTestSeconds * 1000000是超时时间(默认好像是60秒).
如果你想监视一个客户端,最好的方式就是向RTCPInstance注册RRHandle.
- live555学习笔记15-RTCPInstance类小结
- live555学习笔记15-RTCPInstance类小结
- live555学习笔记15-RTCPInstance类小结
- live555学习笔记15-RTCPInstance类小结
- live555学习笔记2-基础类
- live555学习笔记2-基础类
- live555学习笔记2-基础类
- live555学习笔记2-基础类
- live555学习笔记2-基础类
- live555学习笔记2-基础类
- live555学习笔记-基础类
- live555学习笔记2-基础类
- live555学习笔记2-基础类
- live555学习笔记2-基础类
- live555学习小结
- Live555学习笔记14-live555多线程论
- Live555学习笔记14-live555多线程论
- Live555学习笔记14-live555多线程论
- Android程序员必备精品资源
- poj 2175
- Android程序员必备精品资源
- android中ADT和SDK的关系
- 曾国藩不间断读书做笔记 读书十年始展拳脚
- live555学习笔记15-RTCPInstance类小结
- 容器赋值 容器使用问题:vector subscript out of range
- hadoop上优化速度可以采用改变outputDefinition为avro的方法
- karma 自动化单元测试 Jasmine
- 以太网端口在不发送数据的时候,波形是什么样子
- gcc原子操作与spinlock简单对比
- Delphi 与 VC 共享接口和对象
- poj 2777 Count Color(线段树)
- html5学习笔记一:html5简介,html5和html有什么不一样。