live555学习笔记2-基础类
二 基礎類
講幾個重要的基礎類:
BasicUsageEnvironment和UsageEnvironment中的類都是用于整個系統的基礎功能類.比如UsageEnvironment代表了整個系統運行的環境,它提供了錯誤記錄和錯誤報告的功能,無論哪一個類要輸出錯誤,就需要保存UsageEnvironment的指針.而TaskScheduler則提供了任務調度功能.整個程序的運行發動機就是它,它調度任務,執行任務(任務就是一個函數).TaskScheduler由于在全局中只有一個,所以保存在了UsageEnvironment中.而所有的類又都保存了UsageEnvironment的指針,所以誰想把自己的任務加入調度中,那是很容易的.在此還看到一個結論:整個live555(服務端)只有一個線程.
類HashTable:不用多說,實現了哈稀表.
類DelayQueue:譯為"延遲隊列",它是一個隊列,每一項代表了一個要調度的任務(在它的fToken變量中保存).同時保存了這個任務離執行時間點的剩余時間.可以預見,它就是在TaskScheduler中用于管理調度任務的東西.注意,此隊列中的任務只被執行一次!執行完后這一項即被無情拋棄!
類HandlerSet:Handler集合.Handler是什么呢?它是一種專門用于執行socket操作的任務(函數),HandlerSet被TaskScheduler用來管理所有的socket任務(增刪改查).所以TaskScheduler中現在已調度兩種任務了:socket任務(handlerSet)和延遲任務(DelayQueue).其實TaskScheduler還調度第三種任務:Event,介個后面再說.
類Groupsock:這個是放在單獨的庫Groupsock中。它封裝了socket操作,增加了多播放支持和一對多單播的功能.但我只看到它對UDP的支持,好像不支持TCP。它管理著一個本地socket和多個目的地址,因為是UDP,所以只需知道對方地址和端口即可發送數據。Groupsock的構造函數有一個參數是struct in_addr const& groupAddr,在構造函數中首先會調用父類構造函數創建socket對象,然后判斷這個地址,若是多播地址,則加入多播組。Groupsock的兩個成員變量destRecord* fDests和DirectedNetInterfaceSet fMembers都表示目的地址集和,但我始終看不出DirectedNetInterfaceSet fMembers有什么用,且DirectedNetInterfaceSet是一個沒有被繼承的虛類,看起來fMembers沒有什么用。僅fDesk也夠用了,在addDestination()和removeDestination()函數中就是操作fDesk,添加或刪除目的地址。
解釋一下Groupsock::changeDestinationParameters()函數:
//改變目的地址的參數 //newDestAddr是新的目的地址 //newDestPort是新的目的端口 //newDestTTL是新的TTL void Groupsock::changeDestinationParameters( struct in_addr const& newDestAddr, Port newDestPort, int newDestTTL) { if (fDests == NULL) return; //獲取第一個目的地址(此處不是很明白:fDest是一個單向鏈表,每次添加一個目的地址, //都會把它插入到最前目,難道這個函數僅改變最后一個添加的目的地址?) struct in_addr destAddr = fDests->fGroupEId.groupAddress(); if (newDestAddr.s_addr != 0) { if (newDestAddr.s_addr != destAddr.s_addr && IsMulticastAddress(newDestAddr.s_addr)) { //如果目的地址是一個多播地址,則離開老的多播組,加入新的多播組。 socketLeaveGroup(env(), socketNum(), destAddr.s_addr); socketJoinGroup(env(), socketNum(), newDestAddr.s_addr); } destAddr.s_addr = newDestAddr.s_addr; } portNumBits destPortNum = fDests->fGroupEId.portNum(); if (newDestPort.num() != 0) { if (newDestPort.num() != destPortNum && IsMulticastAddress(destAddr.s_addr)) { //如果端口也不一樣,則先更改本身socket的端口 //(其實是關掉原先的socket的,再以新端口打開一個socket)。 changePort(newDestPort); //然后把新的socket加入到新的多播組。 // And rejoin the multicast group: socketJoinGroup(env(), socketNum(), destAddr.s_addr); } destPortNum = newDestPort.num(); fDests->fPort = newDestPort; } u_int8_t destTTL = ttl(); if (newDestTTL != ~0) destTTL = (u_int8_t) newDestTTL; //目標地址的所有信息都在fGroupEId中,所以改變成員fGroupEId。 fDests->fGroupEId = GroupEId(destAddr, destPortNum, destTTL); //(看起來這個函數好像只用于改變多播時的地址參數, //以上分析是否合理,肯請高人指點) }轉載于:https://www.cnblogs.com/phonegap/archive/2011/10/26/2536012.html
總結
以上是生活随笔為你收集整理的live555学习笔记2-基础类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个微信群好听的群名字
- 下一篇: 北辰