In questo esempio vorrei descrivere passo passo come compilare una applicazione corba dopo che sono state installate le librerie ACE TAO nella directory ACE_wrappers. In questo esercizio non utilizzo nessun ambiente di sviluppo in particolare. Il codice puo’ essere scritto anche con un semplice editor. In particolare questo esempio e’ stato realizzato con UBUNTU 10.10 ma puo’ essere benissimo realizzato con una qualsiasi versione di LINUX.
La prima cosa da fare e’ chiaramente installare le librerie ACE TAO. Questa operazione e’ piuttosto semplice. Le indicazioni riportate nel manuale sono abbastanza semplici.
Dal presente link http://www.theaceorb.com e’ possibile scaricare l’ultima versione ACE TAO disponibile. Per la versione linux e’ preferibile scaricare la versione tar.gz: http://download.ociweb.com/TAO-1.6a/ACE+TAO-1.6a.tar.gz
Una volta scaricata la versione occorre compilare il tutto seguendo le note descritte nel seguente link: https://theaceorb.com/support/faq.html#Building-HowToBuildACEandTAOonLinux
A questo punto siamo pronti per poter iniziare a fare il primo progetto. Prima di iniziare pero’ vorrei copiare la mia parte del file .bashrc relativa allo sviluppo delle mie applicazioni in CORBA.
DESCRIZIONE BASHRC
ACE_ROOT=~/ACE_wrappers
export ACE_ROOT
LD_LIBRARY_PATH=$ACE_ROOT/lib
export LD_LIBRARY_PATH
TAO_ROOT=~/ACE_wrappers/TAO
export TAO_ROOT
CIAO_ROOT=~/ACE_wrappers/TAO/CIAO
export CIAO_ROOT
PATH=$PATH:$LD_LIBRARY_PATH:$ACE_ROOT/bin:$ACE_ROOT
DEFINIZIONE DELLA CARTELLA
Creiamo una cartella nella propria home:
mkdir ~/esempioCORBA
Dopo di che inserire nella directory il file idl in comune tra client e server nominato Messenger.idl con il seguente contenuto:
// Messenger.idl
interface Messenger
{
boolean send_message(in string user_name,
in string subject,
inout string message);
};
Con questo semplice idl si vuole creare un interfaccia dove e’ presente una unica funzione send utile per poter inviare un messaggio dal server al client. Questo messaggio sara’ inviato appena si stabilisce la comunicazione tra i due.
Con il comando
tao_idl Messenger.idl
si ottengono i seguenti files:
MessengerC.cpp
MessengerC.h
MessengerC.inl
MessengerS.cpp
MessengerS.h
MessengerS.inl
Tali file sono allegati nel seguente link:
Questa operazione e’ importante durante lo sviluppo del codice ma può essere evitata se si vuole eseguire la compilazione complessiva. Infatti nella fase finale della compilazione questi fine vengono ricreati.
Il servlet deve essere implementato con le funzionalità dell’oggetto:
//file Messenger_i.h:
/* -*- C++ -*- $Id: Messenger_i.h 83399 2008-10-22 15:58:30Z sowayaa $ */
// ****** Code generated by the The ACE ORB (TAO) IDL Compiler *******
// TAO and the TAO IDL Compiler have been developed by the Center for
// Distributed Object Computing at Washington University, St. Louis.
//
// Information about TAO is available at:
// http://www.cs.wustl.edu/~schmidt/TAO.html
#ifndef MESSENGERI_H_
#define MESSENGERI_H_
#include 'MessengerS.h'
#if !defined (ACE_LACKS_PRAGMA_ONCE)
#pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */
#include 'tao/RTCORBA/RTCORBA.h'
//Class Messenger_i
class Messenger_i : public virtual POA_Messenger
{
public:
//Constructor
Messenger_i(CORBA::ORB_ptr orb);
//Destructor
virtual ~Messenger_i();
virtual CORBA::Boolean send_message(const char* user_name,
const char* subject,
char*& message);
private:
RTCORBA::Current_var rt_current_;
};
#endif /* MESSENGERI_H_ */
//file Messenger_i.cpp
#include 'amh_pch.h'
/* -*- C++ -*- $Id: Messenger_i.cpp 85583 2009-06-09 13:47:38Z calabrese_p $ */
// ****** Code generated by the The ACE ORB (TAO) IDL Compiler *******
// TAO and the TAO IDL Compiler have been developed by the Center for
// Distributed Object Computing at Washington University, St. Louis.
//
// Information about TAO is available at:
// http://www.cs.wustl.edu/~schmidt/TAO.html
#include 'Messenger_i.h'
#include <iostream>
// Implementation skeleton constructor
Messenger_i::Messenger_i (void)
{
}
// Implementation skeleton destructor
Messenger_i::~Messenger_i (void)
{
}
CORBA::Boolean Messenger_i::send_message (
const char * user_name,
const char * subject,
char *& message
)
{
std::cout << 'Message from: ' << user_name << std::endl;
std::cout << 'Subject: ' << subject << std::endl;
std::cout << 'Message: ' << message << std::endl;
CORBA::string_free(message);
message = CORBA::string_dup('Thanks for the message.');
return true;
}
A questo punto occorre scrivere il codice utile ad implementare le funzionalità del client e del server ereditando gli skeleton forniti dalla compilazione del idl. Nel seguente allegato sono presenti gli ulteriori file necessari:
MessengerClient.cpp
MessengerServer.cpp
started_pch.cpp
started_pch.h
I file started forniscono ulteriori path all’interno del codice.
MAKEFILE E COMPILAZIONE
Prima di compilare chiaramente occorre chiaramente avere un makefile. Per ottenerlo occorre usare sempre un comando messo a disposizione da ACE TAO:
mwc.pl -type gnuace -recurse -exclude TAO/CIAO -features ssl=1,rpc=1
dall’interno della directory dove sono allocati tutti i file creati.
Per poter procedere con il comando occorre avere nella directory un ulteriore file di input esempioCORBA.mpc al cui interno viene scritto il seguente codice
// $Id: GettingStarted.mpc 979 2008-12-31 20:22:32Z mitza $
project(*idl): taoidldefaults {
idlflags += -Wb,pch_include=started_pch.h
IDL_Files {
Messenger.idl
}
custom_only = 1
}
project(*Server): taoserver {
exename = MessengerServer
after += *idl
Source_Files {
Messenger_i.cpp
MessengerServer.cpp
}
Source_Files {
MessengerC.cpp
MessengerS.cpp
}
IDL_Files {
}
}
project(*Client): taoclient {
exename = MessengerClient
after += *idl
Source_Files {
MessengerClient.cpp
}
Source_Files {
MessengerC.cpp
}
IDL_Files {
}
}
Questo file input permette al tool mwc di capire in che modo generate il makefile. Questo tool e’ molto potente e permette di creare makefile anche in strutture complesse realizzate con tante subfolders
con il comando mwc vengono creati i seguenti file:
GNUmakefile
GNUmakefile.Messager_Client
GNUmakefile.Messager_Idl
GNUmakefile.Messager_Server
A questo punto occorre compilare il tutto lanciando il comando
make
Se non ci sono ulteriori problemi tutto viene compilato correttamente e alla fine nella directory vengono generati i due file eseguibili
MessengerClient
MessengerServer
Lanciando i due eseguibili da due terminali differenti e’ possibile valutare semplicemente in che modo il server invia al client il messaggio utilizzando il comando send presente nella idl specificata.
ESEMPIO CORBA CON L’UTILIZZO DEL NAMESERVICE IN AMBIENTE LINUX
Questo codice e’ stato implementato in Visual Studio 2005 Professional e poi esportato in LINUX con la sola realizzazione del file .mpc necessario per la realizzazione del Makefile.
#compilation:
cd <dir with the code>
mwc.pl -type gnuace -recurse -exclude TAO/CIAO -features ssl=1,rpc=1
make
#esecuzione:
#terminale 1
cd /ACE_wrappers/TAO/orbsvcs/Naming_Service
./Naming_Service -m 1 -ORBEndpoint iiop://localhost:12345
#terminale 2
cd <dir with the code>
SimpleInterfaceServer -ORBDottedDecimalAddresses 1 ORBInitRef NameService=corbaloc:iiop:localhost:12345/NameService
#terminale 3
cd <dir with the code>
SimpleInterfaceClient -ORBDottedDecimalAddresses 1 -ORBInitRef NameService=corbaloc:iiop:localhost:12345/NameService
in seguito descrivero’ accuratamente come un progetto realizzato in Visual C++ puo’ essere esportato in Linux