live555學習筆記15-RTCPInstance類小結
十五: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).此函式只是以下函式的過渡:
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);
}
}
可以看到,每收到一次指定客戶端的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;
}
那麼RTSPServer::RTSPClientSession就會自殺(真是想不開啊).也就是說fOurServer.fReclamationTestSeconds * 1000000是超時時間(預設好像是60秒).
如果你想監視一個客戶端,最好的方式就是向RTCPInstance註冊RRHandle.
相關文章
- Activiti 學習筆記 小結筆記
- TS學習筆記(三):類筆記
- Activiti 學習筆記一到六小結筆記
- 微信小程式學習筆記微信小程式筆記
- react小書學習筆記React筆記
- 抽象類特點 學習筆記抽象筆記
- java學習筆記(包裝類)Java筆記
- Kotlin學習筆記(5)- 類Kotlin筆記
- 類的基礎學習筆記筆記
- 小魚JCL學習筆記(一)筆記
- 提升小波的學習筆記筆記
- Redux 學習總結筆記Redux筆記
- LDAP學習筆記總結LDA筆記
- Go 結構 學習筆記Go筆記
- Python自然語言處理學習筆記(57):小結Python自然語言處理筆記
- 類歐幾里得演算法學習筆記演算法筆記
- TypeScript學習筆記之五類(Class)TypeScript筆記
- iOS學習筆記43 Swift(三)類iOS筆記Swift
- Kotlin學習筆記-類和介面Kotlin筆記
- Java學習筆記之類和物件Java筆記物件
- 小程式學習筆記(未完待續)筆記
- 微信小程式入門學習筆記微信小程式筆記
- GO 學習筆記->結構體Go筆記結構體
- 學習筆記900天總結筆記
- 資料結構學習筆記資料結構筆記
- 學習筆記800天總結筆記
- PL/SQL學習筆記-總結SQL筆記
- struts2學習筆記–執行緒安全問題小結筆記執行緒
- Python自然語言處理學習筆記(66):7.7 小結Python自然語言處理筆記
- 結構動力學教材-學習筆記筆記
- JVM學習筆記——類載入機制JVM筆記
- jvm學習筆記6:類載入器JVM筆記
- Java學習筆記之介面和抽象類Java筆記抽象
- Scala 學習筆記(2)之類和物件筆記物件
- GObject學習筆記(一)類和例項GoObject筆記
- 微信小程式開發學習筆記[4]微信小程式筆記
- 微信小程式開發學習筆記[2]微信小程式筆記
- 微信小程式開發學習筆記[3]微信小程式筆記