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
예외를 얻는다.
감사 미코 들어
@Reimeus 내가 영구 수명 정책도 시도 서비스 이름으로 실행 역할을 시작해야는 (나는에 코드를 추가 내 질문). 그러나 그것도 작동하지 않습니다. –
정확히 작동하지 않는 이유는 무엇입니까? – tuergeist
@tuergeist'corbaloc : iiop : localhost : 12345/hello' 주소를 해결하기 위해'ORB :: string_to_object'를 사용하는 클라이언트를 작성했지만 원격 객체를 찾을 수 없습니다. –