1. 整体说明
应用环境下的面向对象中间件层次(4层):
1) 主机基础设施中间件:封装OS API;
2) 分布式中间件:在1)的基础上提供更高级的服务,例如连接管理和内存管理、同步、多线程等。CORBA、ACE ORB(TAO)?
3) 公共中间件服务:为各种具体应用抽取出公共的服务,例如事件通知、日志记录、持久性、安全且可恢复的事务等。
4) 特定领域中间件服务:为特定的领域(例如电信、电子商务等)提供特定的服务。
分析过程、领域分析(domainanalysis)
问题空间(problem space):面对的是“软件体系及设计”方面的问题。
方案空间(solution space):涉及的是“实现应用程序的软件工具和技术”。
设计空间(design dimension),属于问题空间(?),了解领域内的抽象概念,达成共识。
ACE的层次化体系结构:
1) ACE OS Adaptation层(10%):由一个名为ACE_OS的类构成,包含500多个C++静态方法,这些方法封装了原始的、基于C的OS API。
2) ACE C++ Wrapper Façade层(50%):在以面向对象的方法将1)中的方法封装成C++类。
分类:通信服务、连接/通信角色、通信领域。
3) ACE framework层(40%):加强类间的关联,提供更大粒度上的软件复用。(参考《c++网络编程 卷2》)
2. ACE C++ Wrapper Facade
Network <-->Socket related <-->Message Block related <--> I/O CDR related
其中Socket related包括:Address 、Connector、Acceptor和Stream。
服务器的并发设计: I/O操作是否频繁、计算任务是否繁重(“计算密集”型服务)。
在整个ACE中使用统一的返回约定,即0表示成功,-1表示失败,失败的原因保存在errno中。
3. ACE框架
4. 参考
《Advanced CORBA Programmingwith C++》
http://www.cs.wustl.edu/~schmidt/ACE.html
Douglas C.Schmidt
美国Vanderbilt大学电子工程与计算机科学系的教授。除了学术研究而外,Schmidt教授在面向对象通信系统构建方面已经拥有超过十年的经验。他是面向对象框架Adaptive CommunicationEnvironment(ACE)的首席架构者和开发者,该框架可自由获取、并得到了广泛使用,其中含有一组丰富的组件,实现了用于高性能和实时通信系统的各种设计模式。
附1. 单播、多播和广播
1, 单播(unicast):有具体目标地址的帧从源到达目标地址的过程。比如你对小月喊“小月”,那么只有小月答应你 。单播是说,对特定的主机进行数据传送。例如给某一个主机发送IP数据包。这时候,数据链路层给出的数据头里面是非常具体的目的地址,对于以太网来说,就是网卡的MAC地址(不是FF-FF-FF-FF-FF-FF这样的地址)。现在的具有路由功能的主机应该可以将单播数据定向转发,而目的主机的网络接口则可以过滤掉和自己MAC地址不一致的数据。
2, 多播(multicast):也叫组播。仅应用于UDP。就是帧送往定义在一组内的地址。比如你喊:“是男人都过来一人发一百块钱”。哪么男的都会过来女的就不会过来因为没有钱发她不会理你。多播组?帧仅传送给属于多播组的多个主机。使用多播,主机可加入一个或多个多播组。这样,网卡将获悉该主机属于哪个多播组,然后仅接收主机所在多播组的那些多播帧。Internet组管理协议(IGMP)、多播路由协议(如PIM、DVMRP等)?当一台主机欲加入某个多播组时,会发出“主机成员报告”的IGMP消息通知多播路由器。当多播路由器接收到发给那个多播组的数据时,便会将其转发给所有的多播主机。多播路由器还会周期性地发出“主机成员查询”的IGMP消息,向子网查询多播主机,若发现某个多播组已没有任何成员,则停止转发该多播组的数据。此外,当支持IGMP v2的主机(如Windows 98/2000计算机)退出某个多播组时,还会向路由器发送一条“离开组”的IGMP消息,以通知路由器停止转发该多播组的数据。但只有当子网上所有主机都退出某个多播组时,路由器才会停止向该子网转发该多播组的数据。IP多播应用的编程方法?
参考:http://baike.baidu.com/view/378050.htm
3, 广播(broadcast):仅应用于UDP。就是把帧发往所有能到达的地址。比如学校的广播中喊“今天放假”。哪么全校的同学都会响应,大叫爽死了。广播是主机针对某一个网络上的所有主机发送数据包。这个网络可能是网络,可能是子网,还可能是所有的子网。如果是网络,例如A类网址的广播就是 netid.255.255.255,如果是子网,则是netid.netid.subnetid.255;如果是所有的子网(B类IP)则是则是 netid.netid.255.255。广播所用的MAC地址FF-FF-FF-FF-FF-FF。网络内所有的主机都会收到这个广播数据,网卡只要把 MAC地址为FF-FF-FF-FF-FF-FF的数据交给内核就可以了。一般说来ARP,或者路由协议RIP应该是以广播的形式播发的。
附2. 深入C++丛书