summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManuel Traut <manut@linutronix.de>2009-06-23 23:43:56 +0100
committerManuel Traut <manut@linutronix.de>2009-06-23 23:43:56 +0100
commit950b78b4cd58c90f1c19769994ee37c7286b9804 (patch)
treee026c43a2523195bec68cea619f2abefcbaeac60
parent46f636afe5ad22567351391155da76f8a2e00bc6 (diff)
middleware: added corba example
Signed-off-by: Manuel Traut <manut@linutronix.de>
-rwxr-xr-xframeworks/middleware/examples/corba/Receiver.cpp85
-rwxr-xr-xframeworks/middleware/examples/corba/Supplier.cpp86
-rwxr-xr-xframeworks/middleware/examples/corba/ping.idl15
-rwxr-xr-xframeworks/middleware/examples/corba/ping.mpc15
-rw-r--r--frameworks/middleware/examples/corba/ping_I.cpp24
-rw-r--r--frameworks/middleware/handout_middleware.tex269
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: