二、Live555 基础类
2015-01-14 11:45
316 查看
二 基础类
讲几个重要的基础类:
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()函数:
[cpp]
1. //改变目的地址的参数
2. //newDestAddr 是新的目的地址
3. //newDestPort 是新的目的端口
4. //newDestTTL 是新的 TTL
5. void Groupsock::changeDestinationParameters( 6. struct in_addr const& newDestAddr,
7. Port newDestPort,
8. int newDestTTL)
9. {
10. if (fDests == NULL)
11. return;
12.
13. //获取第一个目的地址(此处不是很明白:fDest 是一个单向链表,每次添加
一个目的地址,
14. //都会把它插入到最前目,难道这个函数仅改变最后一个添加的目的地
址?)
15. struct in_addr destAddr = fDests->fGroupEId.groupAddress();
16. if (newDestAddr.s_addr != 0) {
17. if (newDestAddr.s_addr != destAddr.s_addr
18. && IsMulticastAddress(newDestAddr.s_addr))
19. {
20. //如果目的地址是一个多播地址,则离开老的多播组,加入新的多播组。
21. socketLeaveGroup(env(), socketNum(), destAddr.s_addr);
22. socketJoinGroup(env(), socketNum(), newDestAddr.s_addr);
23. }
24. destAddr.s_addr = newDestAddr.s_addr;
25. }
26. portNumBits destPortNum = fDests->fGroupEId.portNum();
27. if (newDestPort.num() != 0) {
28. if (newDestPort.num() != destPortNum &&
29. IsMulticastAddress(destAddr.s_addr))
30. {
31. //如果端口也不一样,则先更改本身 socket 的端口
32. //(其实是关掉原先的 socket 的,再以新端口打开一个 socket)。
33. changePort(newDestPort);
34. //然后把新的 socket 加入到新的多播组。
35. // And rejoin the multicast group:
36. socketJoinGroup(env(), socketNum(), destAddr.s_addr);
37. }
38. destPortNum = newDestPort.num(); 39. fDests->fPort = newDestPort;
40. }
41. u_int8_t destTTL = ttl();
42. if (newDestTTL != ~0)
43. destTTL = (u_int8_t) newDestTTL;
44. //目标地址的所有信息都在 fGroupEId 中,所以改变成员 fGroupEId。
45. fDests->fGroupEId = GroupEId(destAddr, destPortNum, destTTL);
46.
47. //(看起来这个函数好像只用于改变多播时的地址参数,
48. //以上分析是否合理,肯请高人指点)
49. }
讲几个重要的基础类:
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()函数:
[cpp]
1. //改变目的地址的参数
2. //newDestAddr 是新的目的地址
3. //newDestPort 是新的目的端口
4. //newDestTTL 是新的 TTL
5. void Groupsock::changeDestinationParameters( 6. struct in_addr const& newDestAddr,
7. Port newDestPort,
8. int newDestTTL)
9. {
10. if (fDests == NULL)
11. return;
12.
13. //获取第一个目的地址(此处不是很明白:fDest 是一个单向链表,每次添加
一个目的地址,
14. //都会把它插入到最前目,难道这个函数仅改变最后一个添加的目的地
址?)
15. struct in_addr destAddr = fDests->fGroupEId.groupAddress();
16. if (newDestAddr.s_addr != 0) {
17. if (newDestAddr.s_addr != destAddr.s_addr
18. && IsMulticastAddress(newDestAddr.s_addr))
19. {
20. //如果目的地址是一个多播地址,则离开老的多播组,加入新的多播组。
21. socketLeaveGroup(env(), socketNum(), destAddr.s_addr);
22. socketJoinGroup(env(), socketNum(), newDestAddr.s_addr);
23. }
24. destAddr.s_addr = newDestAddr.s_addr;
25. }
26. portNumBits destPortNum = fDests->fGroupEId.portNum();
27. if (newDestPort.num() != 0) {
28. if (newDestPort.num() != destPortNum &&
29. IsMulticastAddress(destAddr.s_addr))
30. {
31. //如果端口也不一样,则先更改本身 socket 的端口
32. //(其实是关掉原先的 socket 的,再以新端口打开一个 socket)。
33. changePort(newDestPort);
34. //然后把新的 socket 加入到新的多播组。
35. // And rejoin the multicast group:
36. socketJoinGroup(env(), socketNum(), destAddr.s_addr);
37. }
38. destPortNum = newDestPort.num(); 39. fDests->fPort = newDestPort;
40. }
41. u_int8_t destTTL = ttl();
42. if (newDestTTL != ~0)
43. destTTL = (u_int8_t) newDestTTL;
44. //目标地址的所有信息都在 fGroupEId 中,所以改变成员 fGroupEId。
45. fDests->fGroupEId = GroupEId(destAddr, destPortNum, destTTL);
46.
47. //(看起来这个函数好像只用于改变多播时的地址参数,
48. //以上分析是否合理,肯请高人指点)
49. }
相关文章推荐
- live555学习笔记2-基础类
- live555学习笔记2-基础类
- live555学习笔记2-基础类
- 二、Live555 基础类
- live555学习笔记2-基础类
- live555学习笔记-基础类
- live555学习笔记2-基础类
- live555学习笔记2-基础类
- Live555学习基础类
- live555学习笔记2-基础类
- Java基础类中的恶作剧?
- 数据访问抽象基础类
- 数据访问抽象基础类
- 基于live555的rtp/rtcp研究
- Windows下通过VC++6.0编译live555工程(可调试)
- Ogre不负责任研究(三)Math基础类初探
- vc6环境下编译live555库的环境配置方法
- 学习live555的点点滴滴(一)
- live555 开发参考文档
- live555简介