2014-01-22 4 views
2

MICO를 사용하여 C++ CORBA 서버를 만듭니다.corbaloc 액세스가있는 MICO CORBA 서버

내 시스템에서 클라이언트는 corbaloc 주소 (이름 서비스 없음)를 사용하여 서버의 corba 객체에 직접 액세스 할 수 있어야합니다. MICO가 그러한 기능을 제공하는지 알고 있습니까? 어떻게 구현할 수 있습니까? 나는 다음과 같이 시도했다 :

ORB_ptr orb = CORBA::ORB_init (argc, argv, "mico-local-orb"); 
Object_var obj = orb -> resolve_initial_references("RootPOA"); 
PortableServer::POA_var poa = PortableServer::POA::_narrow(obj); 
PortableServer::POAManager_var pman = poa -> the_POAManager(); 
pman -> activate(); 

PortableServer::ObjectId_var oid = PortableServer::string_to_ObjectId("hello"); 

HelloImpl* servant = new HelloImpl(); 

poa -> activate_object_with_id(oid.in(), servant); 
servant -> _remove_ref(); 

orb -> run(); 

이 코드는 OMNIORB에서 작동하지만 MICO에서는 작동하지 않는다.

편집 : 나는 또한 영구적 인 수명 정책을 시도했지만 중 하나가 작동하지 않습니다

ORB_ptr orb = ORB_init(argc, argv); 
Object_var obj = orb -> resolve_initial_references("RootPOA"); 
PortableServer::POA_var poa = PortableServer::POA::_narrow(obj); 
PortableServer::POAManager_var pman = poa -> the_POAManager(); 
pman -> activate(); 

PortableServer::LifespanPolicy_var lifespan = 
    poa -> create_lifespan_policy(PortableServer::PERSISTENT); 
PortableServer::IdAssignmentPolicy_var idassignment = 
    poa -> create_id_assignment_policy (PortableServer::USER_ID); 
CORBA::PolicyList policies(2); 
policies.length(2); 
policies[0] = PortableServer::IdAssignmentPolicy::_duplicate(idassignment); 
policies[1] = PortableServer::LifespanPolicy::_duplicate(lifespan); 
PortableServer::POA_var child_poa = 
    poa -> create_POA("childPOA", pman.in(), policies); 
PortableServer::POAManager_var child_pman = child_poa -> the_POAManager(); 
child_pman -> activate(); 

idassignment -> destroy(); 
lifespan -> destroy(); 

HelloImpl* servant = new HelloImpl(); 

PortableServer::ObjectId_var oid = child_poa -> activate_object(servant); 
CORBA::Object_var ref = child_poa -> id_to_reference(oid.in()); 
PortableServer::ObjectId_var oid = PortableServer::string_to_ObjectId("hello"); 
child_poa -> activate_object_with_id (oid.in(), servant); 

orb -> run(); 

EDIT2 :

: 나는 다음과 같은 corbaloc 주소를 string_to_object하려고 클라이언트와 서버를 테스트
  • corbaloc:iiop:localhost:12345/hello
  • corbaloc:iiop:localhost:12345/childPOA/hello

그러나 그 중 어느 것도 작동하지 않았습니다. 나는 항상 CORBA::OBJECT_NOT_EXIST 예외를 얻는다.

감사 미코 들어

+0

@Reimeus 내가 영구 수명 정책도 시도 서비스 이름으로 실행 역할을 시작해야는 (나는에 코드를 추가 내 질문). 그러나 그것도 작동하지 않습니다. –

+0

정확히 작동하지 않는 이유는 무엇입니까? – tuergeist

+0

@tuergeist'corbaloc : iiop : localhost : 12345/hello' 주소를 해결하기 위해'ORB :: string_to_object'를 사용하는 클라이언트를 작성했지만 원격 객체를 찾을 수 없습니다. –

답변

1

당신은뿐만 아니라 corbalo URL에 POA 계층 구조를 사용해야합니다. 예를 들어 corbaloc::localhost:12345/childPOA/hello가 작동해야합니다.

create a persistent POA with the name ``MyPOA'', and then activate an object 
using the ``MyObject'' Object Id, you could refer to that object using the IOR 

    iioploc://thishost:1234/MyService/MyPOA/MyObject 

편집 상태

도 참조 the Diploma thesis of Frank Pilhofer, the implementor of Mico's POA : 당신은 당신이 -POAImplName MyService

+0

'corbaloc :: localhost : 12345/childPOA/hello'을 시도했지만 항상'CORBA :: OBJECT_NOT_EXIST'를 얻었습니다. 예외 –

+0

그것은 일했다, 고마워. 나는'server.exe -ORBIIOPAddr inet : localhost : 12345 -POAImplName MyService' 그리고'client.exe corbaloc :: localhost : 12345/MyService/childPOA/hello'를 사용하여 서버를 시작해야했습니다. –

관련 문제