- CORBA基本架构
- IDL文件编写
- CPP示例实现(上)
- CPP示例实现(下)
- C示例实现(IOR+NS上)
- C示例实现(IOR+NS下)
- C示例实现(IOR上)
- C示例实现(IOR下)
在linux系统下,有很多开源的CORBA通讯框架,在C的示例中,使用了orbit的框架。
如我用的是Debian系统,可以直接安装:
apt-get install orbit2
apt-get install orbit2-nameserver
apt-get install liborbit2-dev
安装后,可以通过工具orb-rdl-2从idl文件生成需要的stubs及skeletons接口代码:
#该命令会生成文件:Hi.h、Hi-common.c、Hi-skels.c、Hi-stubs.c
orbit-idl-2 Hi.idl
可以通过工具orb-rdl-2从idl文件生成服务端代码:
#该命令会生成模板文件:Hi-skelimpl.c
orbit-idl-2 --skeleton-impl Hi.idl
首先完成服务端部分:
Hi-server-ns.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <orbit/orbit.h>
#include <ORBitservices/CosNaming.h>
#include <ORBitservices/CosNaming_impl.h>
#include "Hi.h"
#include "Hi-skelimpl.c"
/*
./Hi-server_ns
*/
/**
* test for exception
*/
static
gboolean
raised_exception(CORBA_Environment *ev) {
return ((ev)->_major != CORBA_NO_EXCEPTION);
}
/**
* in case of any exception this macro will abort the process
*/
static
void
abort_if_exception(CORBA_Environment *ev, const char* mesg)
{
if (raised_exception (ev)) {
g_error ("%s %s", mesg, CORBA_exception_id (ev));
CORBA_exception_free (ev);
abort();
}
}
/*
* main
*/
int
main (int argc, char *argv[])
{
PortableServer_POA poa;
HiCorba_Hi servant = CORBA_OBJECT_NIL;
CosNaming_NamingContext ns =CORBA_OBJECT_NIL;
CORBA_ORB orb=CORBA_OBJECT_NIL;
CORBA_char name_service[]="Hi";
CosNaming_NameComponent path[1]={name_service,""};
CosNaming_Name name={1,1,path,CORBA_FALSE};
CORBA_Environment ev;
// init ORB
g_print("\nServer>starting server...");
g_print("\nServer>creating and initializing the ORB");
CORBA_exception_init(&ev);
abort_if_exception(&ev, "CORBA_exception_init failed");
orb=CORBA_ORB_init(&argc,argv,"orbit-local-orb",&ev);
abort_if_exception(&ev, "CORBA_ORB_init failed");
// activate POA
g_print("\nServer>getting reference to RootPOA");
poa= (PortableServer_POA) CORBA_ORB_resolve_initial_references(orb,"RootPOA",&ev);
abort_if_exception(&ev, "CORBA_ORB_resolve_initial 'RootPOA' failed");
g_print("\nServer>activating the POA Manager");
PortableServer_POAManager_activate(PortableServer_POA__get_the_POAManager(poa, &ev),&ev);
abort_if_exception(&ev, "POA_activate failed");
// create servant
g_print("\nServer>creating the servant");
servant = impl_HiCorba_Hi__create (poa, &ev);
abort_if_exception(&ev, "impl_HiCorba_Hi__create failed");
// read name_service ior from ns.ior
CORBA_char filename[] = "ns.ior";
FILE *file = NULL;
g_print("\nServer>reading the file '%s'",filename);
if ((file=fopen(filename, "r"))==NULL)
g_error ("could not open '%s'\n", filename);
gchar objref[1024];
fscanf (file, "%s", &objref);
g_print("\nServer>getting the root naming context 'NameService' - from the file '%s'",filename);
g_print("\nServer>the root naming context ior is '%s'",objref);
// bind service
ns = (CosNaming_NamingContext) CORBA_ORB_string_to_object (orb, objref, &ev);
//free (objref);
abort_if_exception(&ev, "CORBA_ORB_string_to_object 'NameService IOR' failed");
g_print("\nServer>binding the object reference in naming with name '%s'",name_service);
CosNaming_NamingContext_rebind(ns,&name,servant,&ev);
abort_if_exception(&ev, "rebind failed");
// start
g_print("\nServer>running the orb...");
CORBA_ORB_run(orb,&ev);
abort_if_exception(&ev, "ORB_run failed");
}
Hi-skelimpl.c
/* This is a template file generated by command */
/* orbit-idl-2 --skeleton-impl Hi.idl */
/* User must edit this file, inserting servant */
/* specific code between markers. */
#include <stdlib.h>
#include <stdio.h>
#include "Hi.h"
/*** App-specific servant structures ***/
#if !defined(_typedef_impl_POA_HiCorba_Hi_)
#define _typedef_impl_POA_HiCorba_Hi_ 1
typedef struct {
POA_HiCorba_Hi servant;
PortableServer_POA poa;
/* ------ add private attributes here ------ */
/* ------ ---------- end ------------ ------ */
} impl_POA_HiCorba_Hi;
#endif
/*** Implementation stub prototypes ***/
#if !defined(_decl_impl_HiCorba_Hi__destroy_)
#define _decl_impl_HiCorba_Hi__destroy_ 1
static void impl_HiCorba_Hi__destroy(impl_POA_HiCorba_Hi *servant,
CORBA_Environment *ev);
#endif
#if !defined(_decl_impl_HiCorba_Hi_sayHiTo_)
#define _decl_impl_HiCorba_Hi_sayHiTo_ 1
static CORBA_string
impl_HiCorba_Hi_sayHiTo(impl_POA_HiCorba_Hi *servant,
const CORBA_char * someone,
CORBA_Environment *ev);
#endif
#if !defined(_decl_impl_HiCorba_Hi_add_)
#define _decl_impl_HiCorba_Hi_add_ 1
static CORBA_long
impl_HiCorba_Hi_add(impl_POA_HiCorba_Hi *servant,
const CORBA_long numa,
const CORBA_long numb,
CORBA_Environment *ev);
#endif
#if !defined(_decl_impl_HiCorba_Hi_shutdown_)
#define _decl_impl_HiCorba_Hi_shutdown_ 1
static void
impl_HiCorba_Hi_shutdown(impl_POA_HiCorba_Hi *servant,
CORBA_Environment *ev);
#endif
/*** epv structures ***/
#if !defined(_impl_HiCorba_Hi_base_epv_)
#define _impl_HiCorba_Hi_base_epv_ 1
static PortableServer_ServantBase__epv impl_HiCorba_Hi_base_epv = {
NULL, /* _private data */
(gpointer) & impl_HiCorba_Hi__destroy, /* finalize routine */
NULL, /* default_POA routine */
};
#endif
#if !defined(_impl_HiCorba_Hi_epv_)
#define _impl_HiCorba_Hi_epv_ 1
static POA_HiCorba_Hi__epv impl_HiCorba_Hi_epv = {
NULL, /* _private */
(gpointer)&impl_HiCorba_Hi_sayHiTo,
(gpointer)&impl_HiCorba_Hi_add,
(gpointer)&impl_HiCorba_Hi_shutdown,
};
#endif
/*** vepv structures ***/
#if !defined(_impl_HiCorba_Hi_vepv_)
#define _impl_HiCorba_Hi_vepv_ 1
static POA_HiCorba_Hi__vepv impl_HiCorba_Hi_vepv = {
&impl_HiCorba_Hi_base_epv,
&impl_HiCorba_Hi_epv,
};
#endif
/*** Stub implementations ***/
#if !defined(_impl_HiCorba_Hi__create_)
#define _impl_HiCorba_Hi__create_ 1
static HiCorba_Hi impl_HiCorba_Hi__create(PortableServer_POA poa, CORBA_Environment *ev)
{
HiCorba_Hi retval;
impl_POA_HiCorba_Hi *newservant;
PortableServer_ObjectId *objid;
newservant = g_new0(impl_POA_HiCorba_Hi, 1);
newservant->servant.vepv = &impl_HiCorba_Hi_vepv;
newservant->poa = (PortableServer_POA) CORBA_Object_duplicate((CORBA_Object)poa, ev);
POA_HiCorba_Hi__init((PortableServer_Servant)newservant, ev);
/* Before servant is going to be activated all
* private attributes must be initialized. */
/* ------ init private attributes here ------ */
/* ------ ---------- end ------------- ------ */
objid = PortableServer_POA_activate_object(poa, newservant, ev);
CORBA_free(objid);
retval = PortableServer_POA_servant_to_reference(poa, newservant, ev);
return retval;
}
#endif
#if !defined(_impl_HiCorba_Hi__destroy_)
#define _impl_HiCorba_Hi__destroy_ 1
static void
impl_HiCorba_Hi__destroy(impl_POA_HiCorba_Hi *servant, CORBA_Environment *ev)
{
CORBA_Object_release ((CORBA_Object) servant->poa, ev);
/* No further remote method calls are delegated to
* servant and you may free your private attributes. */
/* ------ free private attributes here ------ */
/* ------ ---------- end ------------- ------ */
POA_HiCorba_Hi__fini((PortableServer_Servant)servant, ev);
g_free (servant);
}
#endif
#if !defined(_impl_HiCorba_Hi_sayHiTo_)
#define _impl_HiCorba_Hi_sayHiTo_ 1
static CORBA_string
impl_HiCorba_Hi_sayHiTo(impl_POA_HiCorba_Hi *servant,
const CORBA_char * someone,
CORBA_Environment *ev)
{
CORBA_string retval = CORBA_string_alloc(512);
/* ------ insert method code here ------ */
sprintf(retval,"Hi, %s !",someone);
g_print("\nServer>server is returning: %s",retval);
/* ------ ---------- end ------------ ------ */
return retval;
}
#endif
#if !defined(_impl_HiCorba_Hi_add_)
#define _impl_HiCorba_Hi_add_ 1
static CORBA_long
impl_HiCorba_Hi_add(impl_POA_HiCorba_Hi *servant,
const CORBA_long numa,
const CORBA_long numb,
CORBA_Environment *ev)
{
CORBA_long retval;
/* ------ insert method code here ------ */
retval = numa+numb;
/* ------ ---------- end ------------ ------ */
return retval;
}
#endif
#if !defined(_impl_HiCorba_Hi_shutdown_)
#define _impl_HiCorba_Hi_shutdown_ 1
static CORBA_ORB _neo_ORB = CORBA_OBJECT_NIL;
static HiCorba_Hi _neo_servant = CORBA_OBJECT_NIL;
static void set_NEO_ORB(CORBA_ORB theORB, HiCorba_Hi theServant)
{
_neo_ORB = theORB;
_neo_servant = theServant;
}
static void
impl_HiCorba_Hi_shutdown(impl_POA_HiCorba_Hi *servant,
CORBA_Environment *ev)
{
/* ------ insert method code here ------ */
if(_neo_ORB==CORBA_OBJECT_NIL || _neo_servant == CORBA_OBJECT_NIL)return;
//
g_print("\nServer>executing the release");
CORBA_Object_release(_neo_servant,ev);
if((ev)->_major != CORBA_NO_EXCEPTION){
g_error ("%s %s", "Object_release failed", CORBA_exception_id (ev));
CORBA_exception_free (ev);
abort();
}
//
g_print("\nServer>executing the shutdown");
CORBA_ORB_shutdown(_neo_ORB, CORBA_FALSE, ev);
if((ev)->_major != CORBA_NO_EXCEPTION){
g_error ("%s %s", "shutdown failed", CORBA_exception_id (ev));
CORBA_exception_free (ev);
abort();
}
exit(0);
/* ------ ---------- end ------------ ------ */
}
#endif
MakeServer
CC = gcc
CFLAGS = -c -g -pthread -D_REENTRANT -DORBIT2=1 \
-I/usr/include/orbit-2.0 \
-I/usr/include/glib-2.0 \
-I/usr/lib/x86_64-linux-gnu/glib-2.0/include
LDFLAGS = -Wl,--export-dynamic -lORBit-2 -lORBitCosNaming-2 -lgmodule-2.0 \
-ldl -lgobject-2.0 -lgthread-2.0 -lpthread -lglib-2.0 -lm \
-L/usr/lib
ORBIT_IDL= /usr/bin/orbit-idl-2
all : Hi-server-ns.bin
Hi-server-ns.bin : Hi-common.o Hi-skelimpl.o Hi-skels.o Hi-server-ns.o
$(CC) $(LDFLAGS) Hi-common.o Hi-skelimpl.o Hi-skels.o Hi-server-ns.o -o Hi-server-ns.bin
%.o : %.c
$(CC) $(CFLAGS) $< -o $@
nidl : Hi.idl
$(ORBIT_IDL) Hi.idl
$(ORBIT_IDL) --skeleton-impl Hi.idl
clean:
rm -rf *.bin
rm -rf *.o
编译
make -f MakeServer