Avatar billede viht Nybegynder
28. oktober 2002 - 08:31 Der er 14 kommentarer og
1 løsning

VC++ eksempel i CORBA

Er der ikke en der har et C++ eksempel i CORBA der virker i Visual C++ 6.0? Bare meget simpelt.. f.eks. Hello World.
Avatar billede mickni33 Nybegynder
28. oktober 2002 - 18:19 #1
Har ledt hele google igennem :-) (snart)
Kan kun finde teorieen omkring den ikke noget kode.

Men BUilderen skulle vist have noget der hed Visibroker som bruges til Corba
Avatar billede soreno Praktikant
29. oktober 2002 - 20:31 #2
har du været omkring http://omniorb.sourceforge.net/
det kunne være det var interessant.. ?
Avatar billede viht Nybegynder
29. oktober 2002 - 23:12 #3
Jeg har faktisk fundet et hos en anden studerende jeg omgås. Noget helt andet er at jeg har læst om dit 5. semester projekt, soreno. Jeg er interesseret i hvordan du sender så store mængder data fra c++? Bare over en standard winsocket?
Avatar billede soreno Praktikant
30. oktober 2002 - 08:07 #4
tjaaa, der er egentlig ikke ret meget data der skal sendes. jeg har lige kørt klientdelen hos mig selv og outputet er 3.475 bytes hvilket jeg ikke lige betegner som al'verden. Iøvrigt sendes data i perioder, eks. hver halve time eller hvad som man nu ønsker. Alt i alt ikke ret meget data.

det er en ganske almindelig tcp forbindelse som man kan oprette med <winsock2.h>. afsendelsen sker med metoden send(..);
Avatar billede viht Nybegynder
30. oktober 2002 - 12:26 #5
Jeg tænkte du måske havde lavet en MFC socket... applikationen ligner noget lavet i MFC.
Avatar billede soreno Praktikant
30. oktober 2002 - 13:36 #6
den er lavet i ren win32
Avatar billede gedebuk Nybegynder
01. november 2002 - 11:29 #7
Her er et HelloWorld-eksempel, som virker i VC++. Den ORB, jeg bruger, er MICO, som kan findes på www.mico.org. Der kan sourcen downloades, tillige kan dokumentationen. Deri står bl.a., hvordan man sætter MICO op til VC++.

Jeg har følgende filer:

Fil: hello.idl
---------------------------------------------------
interface HelloWorld
{
  string hello();
};

Denne IDL-fil kompileres vha. IDL-compileren til hello.h og hello.cpp

Fil: server.cpp
---------------------------------------------------
#include <fstream.h>
#include "hello.h"
#include <mico/CosNaming.h>

class HelloWorldImpl : virtual public POA_HelloWorld
{
public:
  char* hello();
};

// This is the implementation of the method specified in the IDL file
char* HelloWorldImpl::hello()
{
  cout << "Received a request from the client" << endl;
  return CORBA::string_dup( "Hello World from server" );
}

class Server
{
private:
  CORBA::ORB_var orb;
  PortableServer::POA_var poa;
  PortableServer::POAManager_var mgr;

public:
  Server( int argc, char *argv[] );
  ~Server();
  void attach( PortableServer::StaticImplementation* theServantObj );
  void run();   
};

Server::Server ( int argc, char *argv[] )
{
  // Initialize the ORB
  orb = CORBA::ORB_init (argc, argv);

  // Obtain a reference to the RootPOA and its Manager
  CORBA::Object_var poaobj = orb->resolve_initial_references( "RootPOA" );
  poa = PortableServer::POA::_narrow( poaobj );
  mgr = poa->the_POAManager();
  mgr->activate();
}

void Server::attach( PortableServer::StaticImplementation* theServantObj )
{
  // Activate the Servant
  PortableServer::ObjectId_var oid = poa->activate_object( theServantObj );

  // Initialize the Naming Service
  CORBA::Object_var nsobj = orb->resolve_initial_references( "NameService" );
  CosNaming::NamingContextExt_var nc = CosNaming::NamingContextExt::_narrow( nsobj );

  // Initialize the name of the service, "hello.service"
  CosNaming::Name name;
  name.length( 1 );
  name[0].id = CORBA::string_dup( "hello" );
  name[0].kind = CORBA::string_dup( "service" );

  // Bind the name and object to the Naming Service
  nc->bind( name, theServantObj->_this() );
}

void Server::run()
{
  cout << "Running...\n" << endl;
  orb->run();
}

Server::~Server()
{
  // Shutdown (never reached)
  poa->destroy( TRUE, TRUE ); 
}

void main( int argc, char *argv[] )
{
  Server* s = new Server( argc, argv );

  // Create a Servant object
  PortableServer::StaticImplementation* servant = new HelloWorldImpl();

  s->attach( servant );
  s->run();

  // Shutdown (never reached)
  delete servant;
}

Fil: client.cpp
---------------------------------------------------
#include "hello.h"
#include <mico/CosNaming.h>

#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif

void main( int argc, char *argv[] )
{
  // Initialize the ORB.
  CORBA::ORB_var orb = CORBA::ORB_init( argc, argv );

  // Initialize the Naming Service
  CORBA::Object_var nsobj = orb->resolve_initial_references( "NameService" );
  CosNaming::NamingContext_var nc = CosNaming::NamingContext::_narrow( nsobj );

  // Initialize the name of the service, "hello.service"
  CosNaming::Name name;
  name.length( 1 );
  name[0].id = CORBA::string_dup( "hello" );
  name[0].kind = CORBA::string_dup( "service" );

  // Get the object reference from the Naming Service
  HelloWorld_var hello = HelloWorld::_narrow( nc->resolve( name ) );
 
  // Call the remote method
  char* result = hello->hello();
  cout << "Received result: " << result << endl;
}

Der bliver brugt NamingService, hvorfor NameServeren skal startes. Til det har jeg lavet en bat-fil, som ser således ud (sikkert specifikt for MICO)
nsd -ORBIIOPAddr inet:127.0.0.1:12456

Til start af serveren ser bat-filen sådan ud:
CppServer.exe -ORBNamingAddr inet:127.0.0.1:12456

Til start af klienten ser bat-filen sådan ud:
CppClient.exe -ORBNamingAddr inet:127.0.0.1:12456
Avatar billede viht Nybegynder
01. november 2002 - 14:56 #8
Smukt, det nupper jeg. Tak for det :o)
Avatar billede gedebuk Nybegynder
01. november 2002 - 16:41 #9
NP der :)
Avatar billede viht Nybegynder
01. november 2002 - 18:29 #10
Ved du om man kan make mico med mingw?
Avatar billede soreno Praktikant
01. november 2002 - 18:34 #11
deres hjemmeside siger man kan...
"MICO has been reported to work on the following platforms. Let us know if you succeed in running MICO on other platforms"
[..]
" Windows 9x/NT (Visual-C++ 5+SP3 and 6+SP1, Cygwin or MinGW)"
Avatar billede gedebuk Nybegynder
01. november 2002 - 18:35 #12
Hmmm, nej, det ved jeg faktisk ikke. Men der står en ret grundig vejledning i at kompilere MICO vha. VC++ i den online-dokumentation, der er på deres hjemmeside.
Avatar billede viht Nybegynder
01. november 2002 - 22:34 #13
Ja.. jeg vil bare helst ikke bruge msvc++.. det jeg har lavet indtil videre er lavet med dev-cpp og mingw. Der står man skal installere cygwin for at få dens MAKE tool.. Jeg har installeret cygwin, men såvidt jeg kan se følger der ikke noget make tool med :/ Jeg kan altså ikke compile MICO.
Avatar billede soreno Praktikant
01. november 2002 - 23:31 #14
det er ikke sikkert at det tool hedder make, i nyeste version af mingw (fra www.mingw.org ) er make blevet til noget ala mingw-w32-make.exe. egentlig ret mystisk.
Avatar billede viht Nybegynder
01. november 2002 - 23:33 #15
Der er en make.exe med mingw 2.95.3-6, som jeg bruger. Den kan blot ikke parse de stier der er i makefilen. Derfor de siger man skal bruge cygwin.. tror jeg.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester