UN PICCOLO ESEMPIO CORBA CON ACE+TAO SEGUITO PASSO PASSO FINO ALLA COMPILAZIONE

Click to rate this post!
[Total: 1 Average: 4]

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
0 0 votes
Article Rating
Subscribe
Notify of
guest

1 Comment
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
iElettronica
iElettronica
13 years ago

in seguito descrivero’ accuratamente come un progetto realizzato in Visual C++ puo’ essere esportato in Linux

1
0
Would love your thoughts, please comment.x
()
x