live555学习笔记15-RTCPInstance类小结
2012-05-03 16:03
459 查看
十五:RTCPInstance类小结
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).此函数只是以下函数的过渡:
[cpp]
view plaincopyprint?
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);
}
}
那么RTSPServer::RTSPClientSession就会自杀(真是想不开啊).也就是说fOurServer.fReclamationTestSeconds * 1000000是超时时间(默认好像是60秒).
如果你想监视一个客户端,最好的方式就是向RTCPInstance注册RRHandle.
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).此函数只是以下函数的过渡:
[cpp]
view plaincopyprint?
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);
}
}
[cpp] view plaincopyprint? 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 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; }
那么RTSPServer::RTSPClientSession就会自杀(真是想不开啊).也就是说fOurServer.fReclamationTestSeconds * 1000000是超时时间(默认好像是60秒).
如果你想监视一个客户端,最好的方式就是向RTCPInstance注册RRHandle.
相关文章推荐
- live555学习笔记15-RTCPInstance类小结
- live555学习笔记15-RTCPInstance类小结
- live555学习笔记15-RTCPInstance类小结
- [黑马程序员]15[Foundation框架] Foundation部分学习笔记小结
- live555学习笔记15
- TQ2440 学习笔记—— 15、基础知识小结【汇编、vi】
- [原创]java WEB学习笔记15:域对象的属性操作(pageContext,request,session,application) 及 请求的重定向和转发
- JavaWeb学习笔记-spring-15-AOP-自动创建代理
- java学习笔记15--引用传递
- OAF学习笔记-15-大文本(过长,英文数字)在table 中换行显示
- live555学习笔记9-h264 RTP传输详解(1)
- 产品经理学习笔记(15)-定期整理和总结反馈内容
- Objective-C 学习笔记15 NSProcessInfo
- live555学习笔记13-RTPInterface详解
- live555学习笔记8-RTSPClient分析
- Java中对象的比较 == 和 equals() -Java 学习笔记 (15)
- 学习笔记――Instance
- 算法导论学习笔记(15)——用于不相交集合的数据结构
- ExtJs学习笔记(15)_Column布局
- live555学习笔记12-h264 rtp包的时间戳