- 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 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-ior.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <orbit/orbit.h> #include "Hi.h" #include "Hi-skelimpl.c" /* ./Hi-server_ns -ORBInitRef NameService=[string of IOR of NameService] */ /** * 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; CORBA_ORB orb=CORBA_OBJECT_NIL; 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[] = "service.ior"; FILE *file = NULL; g_print("\nServer>writing the file '%s'",filename); if ((file=fopen(filename, "w"))==NULL) g_error ("could not open '%s'\n", filename); gchar *objref = CORBA_ORB_object_to_string (orb, servant, &ev); abort_if_exception(&ev, "CORBA_ORB_object_to_string' failed"); fprintf(file,"%s",objref); fflush(file); fclose(file); g_print("\nServer>writing the IOR to file '%s'",filename); // 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-ior.bin Hi-server-ior.bin : Hi-common.o Hi-skelimpl.o Hi-skels.o Hi-server-ior.o $(CC) $(LDFLAGS) Hi-common.o Hi-skelimpl.o Hi-skels.o Hi-server-ior.o -o Hi-server-ior.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