diff options
| -rwxr-xr-x | frameworks/middleware/examples/corba/Receiver.cpp | 85 | ||||
| -rwxr-xr-x | frameworks/middleware/examples/corba/Supplier.cpp | 86 | ||||
| -rwxr-xr-x | frameworks/middleware/examples/corba/ping.idl | 15 | ||||
| -rwxr-xr-x | frameworks/middleware/examples/corba/ping.mpc | 15 | ||||
| -rw-r--r-- | frameworks/middleware/examples/corba/ping_I.cpp | 24 | ||||
| -rw-r--r-- | frameworks/middleware/handout_middleware.tex | 269 |
6 files changed, 492 insertions, 2 deletions
diff --git a/frameworks/middleware/examples/corba/Receiver.cpp b/frameworks/middleware/examples/corba/Receiver.cpp new file mode 100755 index 0000000..45ac9dc --- /dev/null +++ b/frameworks/middleware/examples/corba/Receiver.cpp @@ -0,0 +1,85 @@ +/** + * \file Receiver.cpp + * \brief RTCORBA Server, holding one Object for receiving ping calls + * + * \author Manuel Traut + * \version 2009-06-23 + */ + +#include <iostream> + +#include "pingI.h" + +#include "orbsvcs/CosNamingC.h" +#include <tao/RTCORBA/RTCORBA.h> + +int main(int argc, char* argv[]){ + try{ + // initialize ORB + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv, "ServerORB"); + std::cout<<"ORB initialized"<<std::endl; + + // access RT Extensions + CORBA::Object_var rtorb = orb->resolve_initial_references("RTORB"); + RTCORBA::RTORB_var rt_orb = RTCORBA::RTORB::_narrow(rtorb); + std::cout<<"RT Extensions OK"<<std::endl; + + // obtain root_poa + CORBA::Object_var poa = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var root_poa = PortableServer::POA::_narrow(poa.in()); + + // activate POA Manager + PortableServer::POAManager_var poa_manager = root_poa->the_POAManager(); + poa_manager->activate(); + std::cout<<"root_poa OK"<<std::endl; + + // create Policy + CORBA::PolicyList ping_policy(1); + ping_policy.length(1); + ping_policy[0] = rt_orb->create_priority_model_policy( + RTCORBA::CLIENT_PROPAGATED, RTCORBA::maxPriority); + + // create ObjectAdapter, assign Policy + PortableServer::POA_var ping_poa = + root_poa->create_POA("ping_poa", poa_manager.in(), ping_policy); + + std::cout<<"Policy assigned"<<std::endl; + + // create the servant + Linutronix_Ping_i ping_i; + + // activate servant + PortableServer::ObjectId_var object_id = ping_poa->activate_object(&ping_i); + CORBA::Object_var ping_obj = ping_poa->id_to_reference(object_id.in()); + CORBA::String_var ior = orb->object_to_string(ping_obj.in()); + std::cout<<"Servant activated"<<std::endl; + + // NameService + CORBA::Object_var naming_obj = + orb->resolve_initial_references("NameService"); + + std::cout<<"bind\n"; + + CosNaming::NamingContext_var naming_context = + CosNaming::NamingContext::_narrow(naming_obj.in()); + + CosNaming::Name name(1); + name.length(1); + name[0].id = CORBA::string_dup("Receiver"); + + naming_context->rebind(name, ping_obj.in()); + std::cout<<"Bound Receiver to NameService"<<std::endl; + + // start ORB + orb->run(); + std::cout<<"ORB ready"<<std::endl; + + //destroy + root_poa->destroy(1,1); + orb->destroy(); + + } catch(CORBA::Exception &any) { + std::cout<<"Exception: "<<any<<std::endl; + } + return 0; +} diff --git a/frameworks/middleware/examples/corba/Supplier.cpp b/frameworks/middleware/examples/corba/Supplier.cpp new file mode 100755 index 0000000..8d6f413 --- /dev/null +++ b/frameworks/middleware/examples/corba/Supplier.cpp @@ -0,0 +1,86 @@ +/** + * \file Supplier.cpp + * \brief RTCORBA Client, sends ping commands to Receiver + * + * \author Manuel Traut + * \version 2009-06-23 + * + */ + +#include <iostream> +#include <string> +#include <unistd.h> +#include <orbsvcs/CosNamingC.h> +#include <tao/RTCORBA/RTCORBA.h> + +#include "pingC.h" + +static Linutronix::Ping_var ping; +static std::string str; + +int main(int argc, char* argv[]) +{ + if (argc > 1) + str = argv[1]; + else + str = "no argument given"; + + try{ + // initialize ORB + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv, "ClientORB"); + std::cout<<"ORB ok"<<std::endl; + + // get RTORB + CORBA::Object_var rtorb = orb->resolve_initial_references("RTORB"); + RTCORBA::RTORB_var rt_orb = RTCORBA::RTORB::_narrow(rtorb.in()); + std::cout<<"RTORB ok"<<std::endl; + + // NamingService + CORBA::Object_var naming_obj = + orb->resolve_initial_references("NameService"); + + CosNaming::NamingContext_var naming_context = + CosNaming::NamingContext::_narrow(naming_obj.in()); + + std::cout<<"NamingService ok"<<std::endl; + + CosNaming::Name name(1); + name.length(1); + name[0].id = CORBA::string_dup("Receiver"); + + // receive Object + CORBA::Object_var ping_obj = naming_context->resolve(name); + ping = Linutronix::Ping::_narrow(ping_obj.in()); + std::cout<<"TransferOjekt ok"<<std::endl; + + // Private Connection Policy + CORBA::PolicyList pc_policy(1); + pc_policy.length(1); + pc_policy[0] = rt_orb->create_private_connection_policy(); + + CORBA::Object_var new_tran = + ping->_set_policy_overrides(pc_policy, CORBA::SET_OVERRIDE); + + ping = Linutronix::Ping::_narrow(new_tran.in()); + std::cout<<"PrivateConnection ok"<<std::endl; + + struct timespec time_tx; + struct timespec time_done; + + for(unsigned int i = 0; i < 100; i++) + { + clock_gettime(CLOCK_MONOTONIC, &time_tx); + ping->send((const char*)str.c_str()); + clock_gettime(CLOCK_MONOTONIC, &time_done); + std::cout<<time_tx.tv_sec<<":"<<time_tx.tv_nsec/1000<<"\n"; + std::cout<<time_done.tv_sec<<":"<<time_done.tv_nsec/1000<<"\n\n"; + } + + // destroy ORB + orb->destroy(); + + } catch(CORBA::Exception &any) { + std::cout<<"Exception occured: "<<any<<std::endl; + } + return 0; +} diff --git a/frameworks/middleware/examples/corba/ping.idl b/frameworks/middleware/examples/corba/ping.idl new file mode 100755 index 0000000..f41fb07 --- /dev/null +++ b/frameworks/middleware/examples/corba/ping.idl @@ -0,0 +1,15 @@ +/** + * + * \file ping.idl + * \brief Interfacedefinition for ping performance test + * + * \author Manuel Traut + * \version 2009-06-23 + * + */ + +module Linutronix{ + interface Ping{ + oneway void send(in string payload); + }; +}; diff --git a/frameworks/middleware/examples/corba/ping.mpc b/frameworks/middleware/examples/corba/ping.mpc new file mode 100755 index 0000000..f90790e --- /dev/null +++ b/frameworks/middleware/examples/corba/ping.mpc @@ -0,0 +1,15 @@ +project(*Receiver): rt_server, naming { + requires += exceptions + Source_Files { + ping_I.cpp + Receiver.cpp + } +} + +project(*Supplier): rt_client, naming { + requires += exceptions + Source_Files { + pingC.cpp + Supplier.cpp + } +} diff --git a/frameworks/middleware/examples/corba/ping_I.cpp b/frameworks/middleware/examples/corba/ping_I.cpp new file mode 100644 index 0000000..309d1e8 --- /dev/null +++ b/frameworks/middleware/examples/corba/ping_I.cpp @@ -0,0 +1,24 @@ +#include <time.h> +#include <iostream> + +#include "pingI.h" + +// Implementation skeleton constructor +Linutronix_Ping_i::Linutronix_Ping_i (void) +{ +} + +// Implementation skeleton destructor +Linutronix_Ping_i::~Linutronix_Ping_i (void) +{ +} + +void Linutronix_Ping_i::send ( + const char * payload) +{ + // Add your implementation here + struct timespec time_rx; + clock_gettime(CLOCK_MONOTONIC, &time_rx); + std::cout<<time_rx.tv_sec<<":"<<time_rx.tv_nsec/1000<<": "<<payload<<"\n"; +} + diff --git a/frameworks/middleware/handout_middleware.tex b/frameworks/middleware/handout_middleware.tex index 39967ba..88d27f6 100644 --- a/frameworks/middleware/handout_middleware.tex +++ b/frameworks/middleware/handout_middleware.tex @@ -252,9 +252,274 @@ measured in the client. The above described application will be implemented with ACE/TAO RTCORBA and the D-Bus glib bindings: -\subsubsection*{ACE/TAO RTCORBA ping-pong} +\subsubsection*{ACE/TAO RTCORBA} -\subsubsection*{D-Bus glib bindings ping-pong} +First an IDL for the Ping interface will be created (\cmd{ping.idl}: + +\begin{lstlisting} +module Linutronix{ + interface Ping{ + oneway void send(in string payload); + }; +}; +\end{lstlisting} + +Then a IDL compiler is used to generater headers and wrappers for client and +server and a dummy implementation file: + +\cmd{tao\_idl -GI ping.idl} + +The following files will be generated: + +\begin{itemize} +\item pingC.cpp +\item pingC.h +\item pingC.inl +\item pingI.cpp +\item pingI.h +\item pingS.cpp +\item pingS.h +\item pingS.inl +\end{itemize} + +Before editing the implementation dummy, we alter its name, to avoid that it is +overwritten by a further \cmd{tao\_idl} call: + +\cmd{mv pingI.cpp ping\_I.cpp} + +Now we can alter the \cmd{ping\_I.cpp} file, that it looks like this: + +\begin{lstlisting} +#include <time.h> +#include <iostream> + +#include "pingI.h" + +// Implementation skeleton constructor +Linutronix_Ping_i::Linutronix_Ping_i (void) +{ +} + +// Implementation skeleton destructor +Linutronix_Ping_i::~Linutronix_Ping_i (void) +{ +} + +void Linutronix_Ping_i::send ( + const char * payload) +{ + // Add your implementation here + struct timespec time_rx; + clock_gettime(CLOCK_MONOTONIC, &time_rx); + std::cout<<time_rx.tv_sec<<":"<<time_rx.tv_nsec/1000<<": "<<payload<<"\n"; +} + +\end{lstlisting} + +Next step is to create an application \cmd{Receiver.cpp} which hosts the Ping +implementation: + +\begin{lstlisting} +#include <iostream> + +#include "pingI.h" + +#include "orbsvcs/CosNamingC.h" +#include <tao/RTCORBA/RTCORBA.h> + +int main(int argc, char* argv[]){ + try{ + // initialize ORB + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv, "ServerORB"); + std::cout<<"ORB initialized"<<std::endl; + + // access RT Extensions + CORBA::Object_var rtorb = orb->resolve_initial_references("RTORB"); + RTCORBA::RTORB_var rt_orb = RTCORBA::RTORB::_narrow(rtorb); + std::cout<<"RT Extensions OK"<<std::endl; + + // obtain root_poa + CORBA::Object_var poa = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var root_poa = PortableServer::POA::_narrow(poa.in()); + + // activate POA Manager + PortableServer::POAManager_var poa_manager = root_poa->the_POAManager(); + poa_manager->activate(); + std::cout<<"root_poa OK"<<std::endl; + + // create Policy + CORBA::PolicyList ping_policy(1); + ping_policy.length(1); + ping_policy[0] = rt_orb->create_priority_model_policy( + RTCORBA::CLIENT_PROPAGATED, RTCORBA::maxPriority); + + // create ObjectAdapter, assign Policy + PortableServer::POA_var ping_poa = + root_poa->create_POA("ping_poa", poa_manager.in(), ping_policy); + + std::cout<<"Policy assigned"<<std::endl; + + // create the servant + Linutronix_Ping_i ping_i; + + // activate servant + PortableServer::ObjectId_var object_id = ping_poa->activate_object(&ping_i); + CORBA::Object_var ping_obj = ping_poa->id_to_reference(object_id.in()); + CORBA::String_var ior = orb->object_to_string(ping_obj.in()); + std::cout<<"Servant activated"<<std::endl; + + // NameService + CORBA::Object_var naming_obj = + orb->resolve_initial_references("NameService"); + + CosNaming::NamingContext_var naming_context = + CosNaming::NamingContext::_narrow(naming_obj.in()); + + CosNaming::Name name(1); + name.length(1); + name[0].id = CORBA::string_dup("Receiver"); + naming_context->rebind(name, ping_obj.in()); + std::cout<<"Bound Receiver to NameService"<<std::endl; + + // start ORB + orb->run(); + std::cout<<"ORB ready"<<std::endl; + + //destroy + root_poa->destroy(1,1); + orb->destroy(); + + } catch(CORBA::Exception &any) { + std::cout<<"Exception: "<<any<<std::endl; + } + return 0; +} +\end{lstlisting} + +Then we create an application \cmd{Supplier.cpp} which raises calls to the Ping +interface: + +\begin{lstlisting} +#include <iostream> +#include <string> +#include <unistd.h> +#include <orbsvcs/CosNamingC.h> +#include <tao/RTCORBA/RTCORBA.h> + +#include "pingC.h" + +static Linutronix::Ping_var ping; +static std::string str; + +int main(int argc, char* argv[]) +{ + if (argc > 1) + str = argv[1]; + else + str = "no argument given"; + + try{ + // initialize ORB + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv, "ClientORB"); + std::cout<<"ORB ok"<<std::endl; + + // get RTORB + CORBA::Object_var rtorb = orb->resolve_initial_references("RTORB"); + RTCORBA::RTORB_var rt_orb = RTCORBA::RTORB::_narrow(rtorb.in()); + std::cout<<"RTORB ok"<<std::endl; + + // NamingService + CORBA::Object_var naming_obj = + orb->resolve_initial_references("NameService"); + + CosNaming::NamingContext_var naming_context = + CosNaming::NamingContext::_narrow(naming_obj.in()); + + std::cout<<"NamingService ok"<<std::endl; + + CosNaming::Name name(1); + name.length(1); + name[0].id = CORBA::string_dup("Receiver"); + + // receive Object + CORBA::Object_var ping_obj = naming_context->resolve(name); + ping = Linutronix::Ping::_narrow(ping_obj.in()); + std::cout<<"TransferOjekt ok"<<std::endl; + + // Private Connection Policy + CORBA::PolicyList pc_policy(1); + pc_policy.length(1); + pc_policy[0] = rt_orb->create_private_connection_policy(); + + CORBA::Object_var new_tran = + ping->_set_policy_overrides(pc_policy, CORBA::SET_OVERRIDE); + + ping = Linutronix::Ping::_narrow(new_tran.in()); + std::cout<<"PrivateConnection ok"<<std::endl; + + struct timespec time_tx; + struct timespec time_done; + + for(unsigned int i = 0; i < 100; i++) + { + clock_gettime(CLOCK_MONOTONIC, &time_tx); + ping->send((const char*)str.c_str()); + clock_gettime(CLOCK_MONOTONIC, &time_done); + std::cout<<time_tx.tv_sec<<":"<<time_tx.tv_nsec/1000<<"\n"; + std::cout<<time_done.tv_sec<<":"<<time_done.tv_nsec/1000<<"\n\n"; + } + + // destroy ORB + orb->destroy(); + + } catch(CORBA::Exception &any) { + std::cout<<"Exception occured: "<<any<<std::endl; + } + return 0; +} +\end{lstlisting} + +Typically ACE/TAO projects are build with MPC\footnote{MakeProjectCreator}. An +appropirate config file (\cmd{ping.idl}) looks like this: + +\begin{lstlisting} +project(*Receiver): rt_server, naming { + requires += exceptions + Source_Files { + ping_I.cpp + Receiver.cpp + } +} + +project(*Supplier): rt_client, naming { + requires += exceptions + Source_Files { + pingC.cpp + Supplier.cpp + } +} +\end{lstlisting} + +Debian Users can use the following commands to translate all stuff: + +\cmd{export ACE\_ROOT=/usr/share/ace} +\cmd{export TAO\_ROOT=/usr/share/ace/TAO} +\cmd{mpc-ace -type make ping.mpc} +\cmd{make -f Makefile.Ping\_Receiver} +\cmd{make -f Makefile.Ping\_Supplier} + +To run the applications, first a NamingService has to be started: + +\cmd{Naming\_Service -ORBEndpoint iiop://localhost:55555} + +Then the server and client can be started: + +\begin{enumerate} +\item \cmd{./server -ORBInitRef NameService=corbaloc:iiop:localhost:55555/NameService} +\item \cmd{./client -ORBInitRef NameService=corbaloc:iiop:localhost:55555/NameService} +\end{enumerate} + +\subsubsection*{D-Bus glib bindings} First \cmd{ping-server.c} will be created to host the ping object: |
