一、概述

  CORBA(Common Object Request Broker Architecture,
公共对象请求代理体系结构)是由OMG(对象管理组织,Object Management
Group)提出的应用软件体系结构和对象技术规范,其核心是一套标准的语言、接口和协议,以支持异构分布应用程序间的互操作性及独立于平台和编程语言的对象重用。

  CORBA经过近十多年的发展,已逐步走向成熟,并成功地应用在我国许多大型的软件系统中,由此产生了对掌握CORBA技术的软件开发人员的大量需求。在此,我们应广大读者的要求组织了本次讲座。

  二、CORBA产生的背景

  近年来,随着互联网技术的日益成熟,公众及商业企业正享受着高速、低价网络信息传输所带来的高品质数字生活。但是,由于网络规模的不断扩大以及计算机软硬件技术水平的飞速提高,给传统的应用软件系统的实现方式带来了巨大挑战。

  首先,在企业级应用中,硬件系统集成商基于性能、价格、服务等方面的考虑,通常在同一系统中集成来自不同厂商的硬件设备、操作系统、数据库平台和网络协议等,由此带来的异构性给应用软件的互操作性、兼容性以及平滑升级能力带来了严重问题。

  另外,随着基于网络的业务不断增多,传统的客户/服务器(C/S)模式的分布式应用方式越来越显示出在运行效率、系统网络安全性和系统升级能力等方面的局限性。

  为了解决分布式计算环境(DCE,Distributed Computing
Environment)中不同硬件设备和软件系统的互联,增强网络间软件的互操作性,解决传统分布式计算模式中的不足等问题,对象管理组织(OMG)提出了公共对象请求代理体系结构(CORBA),以增强软件系统间的互操作能力,使构造灵活的分布式应用系统成为可能。

  正是基于面向对象技术的发展和成熟、客户/服务器软件系统模式的普遍应用以及集成已有系统等方面的需求,推动了CORBA技术的成熟与发展。作为面向对象系统的对象通信的核心,CORBA为当今网络计算环境带来了真正意义上的互联。

  三、CORBA的发展历程

  1、对象管理组织(OMG)简介

  OMG成立于1989年,作为一个非营利性组织,集中致力于开发在技术上具有先进性、在商业上具有可行性并且独立于厂商的软件互联规范,推广面向对象
模型技术,增强软件的可移植性(Portability)、可重用性(Reusability)和互操作性(Interoperability)。该组织
成立之初,成员包括Unisys、Sun、Cannon、Hewlett-Packard、Philips等在业界享有声誉的软硬件厂商,目前该组织拥有
800多家成员。

  2、CORBA主要版本的发展历程

  ·
1990年11月,OMG发表《对象管理体系指南》,初步阐明了CORBA的思想;

  ·
1991年10月,OMG推出1.0版,其中定义了接口定义语言(IDL)、对象管理模型以及基于动态请求的API和接口仓库等内容;

  · 1991年12月,OMG推出了CORBA
1.1版,在澄清了1.0版中存在的二义性的基础上,引入了对象适配器的概念;

  ·
1996年8月,OMG基于以前的升级版本,完成了2.0版的开发,该版本中重要的内容是对象请求代理间协议(IIOP,Internet
Inter-ORB
Protocol)的引入,用以实现不同厂商的ORB真正意义上的互通;
  · 1998年9月,OMG发表了CORBA
2.3版,增加了支持CORBA对象的异步实时传输、服务质量规范等内容。目前,宣布支持CORBA
2.3规范的中间件厂商包括Inprise(Borland)、Iona、BEA
System等著名的CORBA产品生产商。
  ·
2002年8月,CORBA规范3.0终于出来了,在CORBA3.0规范中去掉了MiniCORBA和实时CORBA。

   四、CORBA体系结构

  CORBA规范充分利用了现今软件技术发展的最新成果,在基于网络的分布式应用环境下实现应用软件的集成,使得面向对象的软件在分布、异构环境下实现可重用、可移植和互操作。其特点可以总结为如下几个方面:

  1、引入中间件(MiddleWare)作为事务代理,完成客户机(Client)向服务对象方(Server)提出的业务请求(引入中间件概念后分布计算模式;

  2、实现客户与服务对象的完全分开,客户不需要了解服务对象的实现过程以及具体位置;

  3、提供软总线机制,使得在任何环境下、采用任何语言开发的软件只要符合接口规范的定义,均能够集成到分布式系统中;

  4、CORBA规范软件系统采用面向对象的软件实现方法开发应用系统,实现对象内部细节的完整封装,保留对象方法的对外接口定义。

  在以上特点中,最突出的是中间件的引入,
在CORBA系统中称为对象请求代理(ORB,Object Request
Broker)和采用面向对象的开发模式。

  对象模型是应用开发人员对客观事物属性和功能的具体抽象。由于CORBA使用了对象模型,将CORBA系统中所有的应用看成是对象及相关操作的集合,
因此通过对象请求代理(ORB),使CORBA系统中分布在网络中应用对象的获取只取决于网络的畅通性和服务对象特征获取的准确程度,而与对象的位置以及
对象所处的设备环境无关。

  CORBA体系的主要内容包括以下几部分:

  (1) 对象请求代理ORB(Object Request
Broker):负责对象在分布环境中透明地收发请求和响应,它是构建分布对象应用、在异构或同构环境下实现应用间互操作的基础。

  (2) 对象服务(Object
Services):为使用和实现对象而提供的基本对象集合,这些服务应独立于应用领域。主要的CORBA服务有:名录服务(Naming
Service)、事件服务(Event Service)、生命周期服务(Life Cycle
Service)、关系服务(Relationship Service)、事务服务(Transaction
Service)等。这些服务几乎包括分布系统和面向对象系统的各个方面,每个组成部分都非常复杂。

  (3) 公共设施(Common
Facilitites):向终端用户提供一组共享服务接口,例如系统管理、组合文档和电子邮件等。

  (4) 应用接口(Application
Interfaces):由销售商提供的可控制其接口的产品,相应于传统的应用层表示,处于参考模型的最高层。

  (5) 领域接口(Domain
Interfaces):为应用领域服务而提供的接口。如OMG组织为PDM系统制定的规范。

  CORBA技术是先进技术发展的结果,它将面向对象的概念揉合到分布计算中,使得CORBA规范成为开放的、基于客户/服务器模式的、面向对象的分布计算的工业标准。

  在CORBA体系结构的中心部分是对象请求代理程序(Object Request
Broker,ORB),它作为一个”软件总线”来连接网络上的不同对象。在客户端,ORB提供一个发送操作调用的接口;而在服务器端,ORB提供一个将操作调用传输到服务器的API。ORB的任务是定位一个合适的服务器,并且通过一个对象适配器(Object
Adapter,OA)将操作调用传送给服务器。OA的目的是:给框架发送方法,调用并且支持服务器对象的生命周期(例如,对象的建立和删除)。老版本的CORBA规范包含一个基本对象适配器(Basic
Object
Adapter,BOA),就像它的名字一样,BOA是十分简单的。它定制的也不是很好,它禁止CORBA应用程序的可移植性。作为CORBA标准的版本2.2,BOA被可对象适配器(Portable
Object Adapter,POA)所取代。MICO支持BOA和POA。

  在客户端,ORB提供一个一般的API,它是一个动态调用接口(Dynamic
Invocation
Interface,DII)来发送操作调用。在服务器端,OA通过动态框架接口(Dynamic
Skeleton
Interface,DSI)来传输一个操作调用,它为服务器端镜像DII的行为。一个在客户和服务器之间的静态接口通过一种接口定义语言(Interface
Definition
Language,IDL)来定义。虽然DII和DSI代表到ORB的一般接口,并且通常被用于桥,但一个IDL规范可以用于产生到ORB的类型安全的、应用特定的接口。

  在客户端,客户与ORB之间的静态接口被称为静态调用接口(Static
Invocation
Interface,SII),在服务器端,这个接口被称为静态框架接口(Static
Skeleton
Interface,SSI)。一个IDL编译器从一个IDL规范来生成一个存根stub和一个框架skeketon。存根的功能类似于一个客户代理,而框架负责发送一个操作调作给一个真正的此操作的实现程序。

  CORBA也定义了两个运行时的数据库。接口存储库(Interface
Repository,IR)包含运行时所需要的IDL规范。IR可以查询用户定义的IDL类型的详细情况,从而提供一个基本类型映射机制。第二个数据库被称为实现存储库(Implementation
Repository,IMR),并且它包含服务器的详细信息(即,哪一个执行程序需要被放置到哪一个服务器上)。OA需要这个信息来自动激活服务器。

  CORBA标准也包含一个ORB之间的协议,它被称为互联网ORB之间的协议(Internet
Inter-ORB
Protocol,IIOP),它描述了基本的和结构化的IDL类型的在线表示,以及协议所需的协议数据单元。设计IIOP的目的是使它保持简单、可升级并且通作。IIOP使用TCP/IP来在不同的ORB之间传输操作调作和它们的参数。

  最后,需要说明一点,CORBA是一个规范而不是一个程序实现。CORBA提供了一个允许在分布式和异构型环境中的应用程序之间进行互操作的框架,但
是关于如何实现CORBA标准的特定技术,它并没有给出任何规定。因此,目前在市场上有许许多的CORBA程序实现,如Iona的
Orbix,Inprise的VisiBroker。

  五、分布式对象技术–
COM、Java和COBRA之间特性比较

  目前国际上,分布式对象技术有三大流派–
COBRA、COM/DCOM和Java。CORBA技术是最早出现的,1991年OMG颁布了COBRA
1.0标准,在当时来说做得非常漂亮;再有就是Microsoft的COM系列,从最初的COM发展成现在的DCOM,形成了Microsoft一套分布
式对象的计算平台;而Sun公司的Java平台,在其最早推出的时候,只提供了远程的方法调用,在当时并不能被称为分布式对象计算,只是属于网络计算里的
一种,接着推出的JavaBean,也还不足以和上述两大流派抗衡,而其目前的版本叫J2EE,推出了EJB,除了语言外还有组件的标准以及组件之间协同
工作通讯的框架。于是,也就形成了目前的三大流派。

  应该说,这三者之中,COBRA标准是做的最漂亮的。COBRA标准主要分为3个层次:对象请求代理、公共对象服务和公共设施。最底层是对象请求代理
ORB,规定了分布对象的定义(接口)和语言映射,实现对象间的通讯和互操作,是分布对象系统中的”软总线”;在ORB之上定义了很多公共服务,可以提供
诸如并发服务、名字服务、事务(交易)服务、安全服务等各种各样的服务;最上层的公共设施则定义了组件框架,提供可直接为业务对象使用的服务,规定业务对
象有效协作所需的协定规则。总之,CORBA的特点是大而全,互操作性和开放性非常好。目前CORBA的版本是2.3。CORBA
3.0也已完成了,增加了有关Internet集成和QoS控制等内容。CORBA的缺点是庞大而复杂,并且技术和标准的更新相对较慢,COBRA规范从
1.0升级到2.0所花的时间非常短,而再往上的版本的发布就相对十分缓慢了。

  相比之下,Java标准的制订就快得多,Java是Sun公司自己定的,演变的很快。Java的优势是纯语言的,跨平台性非常好。Java分布对象技
术通常指远程方法调用(RMI)和企业级JavaBean(EJB)。RMI提供了一个Java对象远程调用另一Java对象的方法的能力,与传统RPC
类似,只能支持初级的分布对象互操作。Sun公司于是基于RMI,提出了EJB。基于Java服务器端组件模型,EJB框架提供了像远程访问、安全、交
易、持久和生命期管理等多种支持分布对象计算的服务。目前,Java技术和CORBA技术有融合的趋势。

  COM技术是Microsoft独家做的,是在Windows
3.1中最初为支持复合文档而使用OLE技术上发展而来,经历了OLE
2/COM、ActiveX、DCOM和COM+等几个阶段,目前COM+把消息通讯模块MSMQ和解决关键业务的交易模块MTS都加进去了,是分布对象
计算的一个比较完整的平台。Microsoft的COM平台效率比较高,同时它有一系列相应的开发工具支持,应用开发相对简单。但它有一个致命的弱点就是
COM的跨平台性较差,如何实现与第三方厂商的互操作性始终是它的一大问题。从分布对象技术发展的角度来看,大多数人认为COM竞争不过COBRA。

  下面是三者在集成性和可用性方面的比较:

  ·CORBA/ORB ActiveX/DCOM EJB/RMI
  ·集成性:
  ·支持跨语言操作 好 好 一般
  ·支持跨平台操作 好 一般 好
  ·网络通讯 好 一般 好
  ·公共服务构件 好 一般 好

  可用性:

  ·事务处理 好 一般 一般
  ·消息服务 一般 一般 一般
  ·安全服务 好 一般 好
  ·目录服务 好 一般 一般
  ·容错性 一般 一般 一般
  ·产品成熟性 一般 一般 一般
  ·软件开发商的支持度 一般 好 好
  ·可扩展性 好 一般 好

   六、CORBA应用前景

  CORBA规范的推出,重新调整了客户机与服务器之间的关系。客户机可以向服务器提出事务请求,同时也可以为下一个请求充当服务器角色。

  由于CORBA系统引入了中间件的概念,即事务代理,由中间件完成客户机与服务器之间的通信,使得服务器对于客户机的位置相对透明,取消了原有分布式
计算模型中客户机、服务器之间的一一对应关系。CORBA客户机可以在运行时动态获得服务对象的位置,并且可以对多个服务对象提交事务请求,因此,极大推
动了分布计算的发展。

  分布计算是指网络中两个或两个以上的软件相互共享信息资源。这些软件可以位于同一台计算机中,也可以部署在网络节点的任意位置。基于分布式模型的软件系统具有均衡运行系统负载、共享网络资源的技术优势。

  另外,CORBA规范约束采用面向对象的分布式软件的构造方法,以接口定义语言的形式实现对象内部细节的完整封装,从而降低了软件系统的复杂程度,增
加了软件功能的可重用性。CORBA提供到C/C++、Java、SmallTalk等高级语言的映射,很大程度地减小了对程序设计语言的依赖性,使软件
开发人员可以在较大范围内共享已有成果。

  正是以上特点推动了分布式多层软件体系结构的发展。目前,CORBA技术在银行、电信、保险、电力和电子商务领域都有广泛的应用。对象中间件技术发展
迅速,各大软硬件厂商都在积极参与有关标准的制定和产品开发工作,像IBM、HP、DEC、AT&T、ICL、Microsoft等都制定了相应
的战略。许多对象中间件的专门厂商也相继诞生,未来的对象中间件市场将会出现群雄逐鹿的局面。

  附:学习CORBA应理解的一些基本概念

  1、CORBA(Common Object Request Broker
Architecture)公共对象请求代理程序体系结构)。CORBA是一个规范(specification)而不是程序实现(implementation)。它提供了一个允许在分布式和异构型环境中应用程序之间进行互操作的框架。

  2、ORB(Object Request
Broker)对象请求代理:它作为一个”软件总线”来连接网络上的不同对象,提供对象的定位和方法调用,它是CORBA实现的关键。

  3、OA(Object
Adapter)对象适配器:用于构造对象实现与ORB之间的接口。它给框架发送方法,调用并且支持服务器对象的生命周期(如:对象的创建和删除)。

  4、BOA(Basic Object
Adapter)基本对象适配器:负责激活对象,即当客户请求对象的服务时,激活对象实现的能力。

  5、POA(Portable Object
Adapter)可移植对象适配器:是BOA的替代方式,提供大量可扩展的接口,来处理一些对于BOA来说不合理的要求。特性:

  (1)支持透明激活对象。

  (2)允许单个服务者支持很多对象标识。

  (3)允许一个服务者上有多个POA,每个都有自己的一套管理策略。

  (4)将对不存在服务者的请求委托给默认服务者,或者向服务者的管理器请求一个合适的服务者。

  6、DII(Dynamic Invocation
Interface)动态调用接口:位于客户端,发送客户端的调用请求。

  7、DSI(Dynamic Skeleton
Interface)动态框架接口,位于服务器端,传送客户端的调用请求。

  8、IDL(Interface Definition
Language)接口定义语言:定义客户和服务器之间的静态接口,通过编译器生成客户存根、服务器框架,以及根据支持的语言映射,自动生成来自一个CORBA
IDL的代码。目前支持的语言映射包括:Java,C++,Ada,SmallTalk和COBOL等。

  9、SII(Static Invocation
Interface)静态调用接口:位于客户端,客户与ORB之间的静态接口。

  10、SSI(Static Skeleton
Interface)静态框架接口:位于服务器端,ORB与服务器之间的静态接口。

  11、stub
存根:位于客户端,由IDL编译器编译IDL文件生成,其功能类似一个客户代理。

  12、skeleton
框架:位于服务器端,由IDL编译器编译IDL文件生成,其功能是负责发送一个操作调用给能实现此操作的服务。

  13、IR(Interface
Repository)接口存储库:存储运行时所需要的IDL规范。

  14、IMR(Implementation
Repository)实现存储库:存储对象实现(一个服务器)的详细信息(即一个执行程序需要被放置在哪一个服务器上)。

  15、GIOP(General Inter-ORB
Protocol)通用ORB之间的协议:定义了一个不同ORB之间的接口。

  16、IIOP(Internet Inter-ORB
Protocol)因特网ORB之间的协议:IIOP把GIOP消息数据映射为TCP/IP连接行为和输入/输出流读/写。

  注意:IIOP不是完全从GIOP分离出来的协议,它更像是GIOP的一个实例。

  17、IOR(Interoperable Object
Reference)可操作对象引用:它包括所有客户与服务器联系所需的各种信息(包括CORBA服务器对象进程的IP地址和TCP端口等),ORB将通过它产生在网络上唯一标识那个将被分布对象的消息。

  18、ORBAservices–
CORBA服务:在ORB级别之上,定义了大多数分布式企业对象利用的公共服务。

  如:命名服务、交易对象服务、关系服务、生命周期服务、外表化服务、持久性服务、查询服务、对象集合服务、属性服务、事件服务、许可证服务、时间服务、事务服务、并发控制服务和安全服务等

  19、CORBAfacilities–
CORBA工厂:位于CORBAservices之上,定义了更高层次的分步式服务与框架。如:打印、电子邮件、文档管理等。

GNOME CORBA简介(2)

What\’s CORBA?

CORBA(Common Object Request Broker
Architecture)是一组标准,用来定义“分布式对象系统”,由OMG(Object
Menagement
Group)作为发起和标准制定单位。OMG由700多家公司和单位组成,几乎包括了所有有影响的公司。CORBA的目的是定义一套协议,符合这个协议的对象可以互相交互,不论它们是用什么样的语言写的,不论它们运行于什么样的机器和操作系统。

例如一个用C实现的对象Apple有一个方法eat,运行在NT机器host1上,我从一台Linux机器host2上,用Ada写了一个程序Boy,这个程序可以调用对象Apple的方法eat,并获得执行结果,而无须关心它是在本地还是在host1上。

为了达到这个目标,CORBA制定了一套对象间通信的协议。通信介质被称为ORB(Object
Request
Broker),它负责在对象之间传递消息。如果对象在同一台机器上,ORB可以采用一些IPC技术来优化消息的传递,如果在不同的机器上,则使用IIOP或GIOP协议(可以建立在任何网络通信协议之上)。IIOP(Internet
Inter-ORB
Protocol)就是基于IP协议,为方便Internet上的CORBA应用而设计的。

ORB是CORBA应用的基础,不同的公司可以开发出不同的ORB。但由于大家使用相同的通信协议,因此基于不同ORB实现的应用之间可以无缝通信。如下图:

CORBA学习 <wbr>[2007年10月23日]

图1:ORB通信

注意,这里的stub类似与DCOM中的proxy,而这里的skeleton则类似与DCOM中的stub。

CORBA为了真正做到分布式的对象系统,仅有一个ORB是远远不够的。CORBA还必须定义大量的对象和伪对象才能满足分布式的对象系统下程序员的要求。其中主要包括两大类:

  • Corba Services:naming
    services(帮助client找到它需要的对象);security
    services(对象的认证,通信安全等);license
    serivices(控制用户对软件的使用)等等。目前一共有16个services,但一般的CORB系统仅实现了其中的一到两个;
  • Corba facilities:这是建立在CORBA
    Services之上的大量的对象实现,主要用于特定的工业部门,如电信,医药,法律等等。

CORBA与其它分布式技术的区别和比较

RMI,DCOM,RPC,socket,Q3 etc。

IDL简介

为了能让不同语言(机器环境,操作系统)下的对象对象之间可以对话,需要一套共同语言。IDL就是专门为此而制定的。IDL(Interface
Definition
Language)看起来非常类似与C++(或Java)的头文件定义。它与DCOM下的IDL并不是一回事,但可以想象,它们非常接近。

IDL定义了一个对象支持的方法和属性,一个对象的实现只要符合这个定义,可以完全自由开发,例如,你可以用任何你喜欢的语言。给出一个对象的IDL文件,其它对象就完全掌握了这个对象的行为,可以按照自己的意图随意操纵。

另外IDL不仅仅是让人看的,IDL编译器可以编译它,替程序员自动生成sub和skeleton,使得程序员从这项难堪的工作中解脱出来。

IDL的例子

IDL作为一种语言,为了实现强移植性,因而也是强类型的。

module FruitsBasket {                                     //module类似于namespace
        exception no_more_fruits {                      //exception for catching
                string reason;
        };

        interface Apple {                                //interface定义了一个接口,类似于class
                attribute string color;                 //attribute定义变量
                const float weight = 2.3;               //const定义常量
                const string type = "sample type";
                void eat_me (inout boolean eat_yes_or_not ) raises ( no_more_fruits );  //raise exception
                oneway boolean eaten ();                                //oneway是异步执行
                boolean who_ate ( out string who_surname, out string who_name ); //out
        };
        interface Orange {
                attribute float size;
        };
        interface RedApple : Apple {                    //inheritance 
                //something specific to red apple
        }
};

IDL支持多重继承,但不支持重载和同一个方法不同的签名。

CORBA编程

IDL的语言映射

要想用某种语言实现CORBA IDL定义的对象,需要在IDL和该语言间进行映射,称为language mapping。这也是CORBA标准的一部分。目前已制定了映射标准的语言包括:C,C++,Java,Smalltalk,COBOL等。C因为不是OO的语言,所以在CORBA应用中较少使用,但因为GNOME基本是用C实现的,所以这里使用C的映射。

GNOME中CORBA ORB的实现称为ORBit。最开始GNOME的实现者并未打算实现一个自己的ORB,因为已经有大量免费的实现。他们选择了MICO,但很快发现MICO不能满足GNOME开发的需要,于是Elliot Lee和Dick Porter 决定自己从头写一个新的符合要求的ORB,这就是ORBit。ORBit是按照CORBA2.2标准写的,特别是它的hooks使得与GNOME的应用可以很好的交互。

ORBit是用C写的,非常小而且非常快,使得它可以应用于很多以前认为不适于CORBA技术的场合。它的主要特点:

  • 基于C的实现;
  • 执行迅速,节省时间;
  • 空间使用效率很高;
  • 解决实际问题,而不仅仅是一个艺术品;
  • 它是自由软件。

目前ORBit支持的语言包括:perl, C++, TCL, Python, Ada, Eiffel。

举例说明

编写ORBit下程序常见问题:

  • LD_LIBRARY_PATH未定义;
  • IOR后面跟了一个换行符;
  • 忘了激活POAManager;

IDL文件

interface Echo {
        void echoString(in string input);
};

Client程序

共分三步:1)初始化ORB, 2)获得对象; 3)使用对象。

#include "stdio.h"
#include "orb/orbit.h"

/*
 * This header file was generated from the idl
 */

#include "echo.h"

/*
 * This is our Echo Object
 */

Echo echo_client;

int
main (int argc, char *argv[])
{
    CORBA_Environment ev;
    CORBA_ORB orb;

    FILE * ifp;
    char * ior;
    char filebuffer[1024];

    /*
     * Standard initalisation of the orb. Notice that
     * ORB_init \'eats\' stuff off the command line
     */

    CORBA_exception_init(&ev);
    orb = CORBA_ORB_init(&argc, argv, "orbit-local-orb", &ev);

    /*
     * Get the IOR (object reference). It should be written out
     * by the echo-server into the file echo.ior. So - if you
     * are running the server in the same place as the client,
     * this should be fine!
     */

    ifp = fopen("echo.ior","r");
    if( ifp == NULL ) {
      g_error("No echo.ior file!");
      exit(-1);
    }

    fgets(filebuffer,1024,ifp);
    ior = g_strdup(filebuffer);

    fclose(ifp);
    /*
     * Actually get the object. So easy!
     */

    echo_client = CORBA_ORB_string_to_object(orb, ior, &ev);
    if (!echo_client) {
        printf("Cannot bind to %s\n", ior);
        return 1;
    }

    /*
     * Ok. Now we use the echo object...
     */

    printf("Type messages to the server\n. as the only thing on the line stops\n");
    while( fgets(filebuffer,1024,stdin) ) {
      if( filebuffer[0] == \'.\' && filebuffer[1] == \'\n\' ) 
        break;

      /* chop the newline off */
      filebuffer[strlen(filebuffer)-1] = \'\0\';
      
      /* using the echoString method in the Echo object               */
      /* this is defined in the echo.h header, compiled from echo.idl */

      Echo_echoString(echo_client,filebuffer,&ev);

      /* catch any exceptions (eg, network is down) */

      if(ev._major != CORBA_NO_EXCEPTION) {
        printf("we got exception %d from echoString!\n", ev._major);
        return 1;
      }
    }
      
    /* Clean up */
    CORBA_Object_release(echo_client, &ev);
    CORBA_Object_release((CORBA_Object)orb, &ev);

    return 0;
}


Server程序

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "signal.h"
#include "orb/orbit.h"
#include "echo.h"

/* This is so we can get out a valid IOR later... */
Echo echo_client = CORBA_OBJECT_NIL;

/* declaration of the meat of the process*/
static void
do_echoString(PortableServer_Servant servant,
              CORBA_char *astring,
              CORBA_Environment *ev);

/*
 * I have **no** idea what this bit does
 */
PortableServer_ServantBase__epv base_epv = {
  NULL,
  NULL,
  NULL
};
POA_Echo__epv echo_epv = { NULL, do_echoString };
POA_Echo__vepv poa_echo_vepv = { &base_epv, &echo_epv };
POA_Echo poa_echo_servant = { NULL, &poa_echo_vepv };

int
main (int argc, char *argv[])
{
    PortableServer_ObjectId objid = {0, sizeof("myEchoString"), "myEchoString"};
    PortableServer_POA poa;

    CORBA_Environment ev;
    char *retval;
    CORBA_ORB orb;
    FILE * ofp;

    signal(SIGINT, exit);
    signal(SIGTERM, exit);

    CORBA_exception_init(&ev);
    orb = CORBA_ORB_init(&argc, argv, "orbit-local-orb", &ev);

    POA_Echo__init(&poa_echo_servant, &ev);

    poa = (PortableServer_POA)CORBA_ORB_resolve_initial_references(orb, "RootPOA", &ev);
    PortableServer_POAManager_activate(PortableServer_POA__get_the_POAManager(poa, &ev), &ev);
    PortableServer_POA_activate_object_with_id(poa,
                                               &objid, &poa_echo_servant, &ev);

    echo_client = PortableServer_POA_servant_to_reference(poa,
                                                          &poa_echo_servant,
                                                          &ev);
    if (!echo_client) {
        printf("Cannot get objref\n");
        return 1;
    }

    retval = CORBA_ORB_object_to_string(orb, echo_client, &ev);

    ofp = fopen("echo.ior","w");

    fprintf(ofp,"%s", retval);
    fclose(ofp);

    CORBA_free(retval);

    fprintf(stdout,"Written the file echo.ior with the IOR of this server.\n Now waiting for requests...\n");
    fflush(stdout);
    CORBA_ORB_run(orb, &ev);

    return 0;
}

static void
do_echoString(PortableServer_Servant servant,
              CORBA_char *astring,
              CORBA_Environment *ev)
{
  g_message("[server] %s", astring);
  return;
}

 

版权声明:本文为MRRAOBX原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/MRRAOBX/articles/4180119.html