2016-03-30 4 views
1

Ich habe eine IDL wie untenCORBA omniORB derzeit keine Remote-Objekt erhalten, nachdem Kontext Namensauflösung

module IClientServer { 

    interface IClient 
    { 
    void serverResponse(in string name, in string data); 

    void start(); 

    void stop(); 

    void shutdown(); 

    }; 

    interface IServer 
    { 

    // Server calls back to client just once in a 
    // recursive call before returning. 
    // void one_time(in CallBack cb, in string mesg); 
    void DataFromX(in string name,in string data,in long lbytes,in short usg); 

    void Authenticate(in IClient client, in string dataToNegotiate); 

    // Shuts down the server. 
    void shutdown(); 

    }; 
}; 

für die ich generierte Proxy & Skelett mit idl2cpp Dienstprogramm (onmiORB) und verknüpft generierten Dateien auf Server & Client-Anwendung als in dem Dokument vorgeschlagen

Dann begann ich Name Service (omniNames) aufgelöst und Registrierungsschlüssel omniORB \ InitRef als in der Dokumentation für den Server & Client-Anwendungen vorgeschlagen zu verbinden, ohne Argumente mit

Kommandozeile

ist unter dem Servercode

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    try 
    { 
    int argc = 0; 
     _BRDTRACE("Initializing....\n"); 
     CORBA::ORB_var orb = CORBA::ORB_init(argc, NULL); 
//   cerr << "Initialized." << endl; 

     CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); 
     _BRDTRACE("Resolved.\n"); 


     PortableServer::POA_var poa = PortableServer::POA::_narrow(obj); 
     _BRDTRACE("Narrowed..\n"); 

      // Obtain a reference to the object, and register it in 
      // the naming service. 
     server_i* myserver = new server_i(); 
//   cerr << "Constructed." << endl; 

     obj = myserver->_this(); 
     _BRDTRACE("obj retrieved.\n"); 

     CORBA::String_var x; 
     x = orb->object_to_string(obj); 
     _BRDTRACE("obj to string.\n"); 

     if(!bindObjectToName(orb, obj)) 
     { 
//   cerr << "Failed to bind obj to name." << endl; 
      throw; 
     } 

     _BRDTRACE("binded\n"); 
     myserver->_remove_ref(); 
//   cerr << "removed ref." << endl; 

     PortableServer::POAManager_var pman = poa->the_POAManager(); 
     pman->activate(); 
     _BRDTRACE("activated.\n"); 

//   cerr << "Executing..." << endl; 
     orb->run(); 
     _BRDTRACE("Terminated.\n"); 

     myserver->shutdown(); 
//   cerr << "Shutdown." << endl; 

    } 
    catch(CORBA::SystemException&) 
    { 
     _BRDTRACE("Caught CORBA::SystemException.\n"); 
    } 
    catch(CORBA::Exception&) { 
     _BRDTRACE("Caught CORBA::Exception.\n"); 
    } 
    catch(omniORB::fatalException&) 
    { 
     _BRDTRACE("Caught omniORB::fatalException:\n"); 
//   cerr << " file: " << fe.file() << endl; 
//   cerr << " line: " << fe.line() << endl; 
//   cerr << " mesg: " << fe.errmsg() << endl; 
    } 
    catch(...) { 
     _BRDTRACE("Caught unknown exception.\n"); 
    } 

} 

static CORBA::Boolean 
bindObjectToName(CORBA::ORB_ptr orb, CORBA::Object_ptr objref) 
{ 
    CosNaming::NamingContext_var rootContext; 

    try { 
    // Obtain a reference to the root context of the Name service: 
    CORBA::Object_var obj; 
    obj = orb->resolve_initial_references("NameService"); 

    // Narrow the reference returned. 
    rootContext = CosNaming::NamingContext::_narrow(obj); 
    if(CORBA::is_nil(rootContext)) { 
     _BRDTRACE("Failed to narrow the root naming context.\n"); 
     return 0; 
    } 
    } 
    catch(CORBA::ORB::InvalidName& ex) { 
    // This should not happen! 
    _BRDTRACE("Service required is invalid [does not exist].\n"); 
    return 0; 
    } 

    try { 
    // Bind a context called "test" to the root context: 

    CosNaming::Name contextName; 
    contextName.length(1); 
    contextName[0].id = (const char*) "birdseye";  // string copied 
    contextName[0].kind = (const char*) "collections_context"; // string copied 
    // Note on kind: The kind field is used to indicate the type 
    // of the object. This is to avoid conventions such as that used 
    // by files (name.type -- e.g. test.ps = postscript etc.) 

    //CosNaming::NamingContext_var testContext; 
    try { 
     // Bind the context to root. 
     rootContext->bind(contextName, objref); 
    } 
    catch(CosNaming::NamingContext::AlreadyBound& ex) { 
     // If the context already exists, this exception will be raised. 
     // In this case, just resolve the name and assign testContext 
     // to the object returned: 
     CORBA::Object_var obj; 
     obj = rootContext->resolve(contextName); 
     CosNaming::NamingContext_var testContext = CosNaming::NamingContext::_narrow(obj); 
     if(CORBA::is_nil(testContext)) { 
     _BRDTRACE("Failed to narrow naming context.\n"); 
     return 0; 
     } 
    } 
    } catch(CORBA::COMM_FAILURE& ex) { 
    _BRDTRACE("Caught system exception COMM_FAILURE -- unable to contact the naming service.\n"); 
    return 0; 
    } 
    catch(CORBA::SystemException&) { 
    _BRDTRACE("Caught a CORBA::SystemException while using the naming service.\n"); 
    return 0; 
    } 

    return 1; 
} 

aber der Code unten in der Client-Seite nil Objekt nach Namen Kontextauflösung. Nicht in der Lage, das Problem zu lösen. Bitte helfen Sie!

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); 
    CORBA::Object_var objRef = orb->resolve_initial_references("NameService"); 
    CORBA::Object_var obj = getObjectReference(orb); 
    IClientServer::IServer_var svr = IClientServer::IServer::_narrow(obj.in()); 
    if(CORBA::is_nil(svr)) { **//THIS IS WHERE THE ISSUE IS** 
// _BRDTRACE("cb_client: The server reference is nil!\n"); 
    return 0; 
    } 
    return 0; 
} 

static CORBA::Object_ptr 
getObjectReference(CORBA::ORB_ptr orb) 
{ 
    CosNaming::NamingContext_var rootContext; 

    try { 
    // Obtain a reference to the root context of the Name service: 
    CORBA::Object_var obj; 
    obj = orb->resolve_initial_references("NameService"); 

    // Narrow the reference returned. 
    rootContext = CosNaming::NamingContext::_narrow(obj); 
    if(CORBA::is_nil(rootContext)) { 
//  cerr << "Failed to narrow the root naming context." << endl; 
     return CORBA::Object::_nil(); 
    } 
    } 
    catch(CORBA::ORB::InvalidName&) { 
    // This should not happen! 
    return CORBA::Object::_nil(); 
    } 
    // Create a name object, containing the name test/context: 
    CosNaming::Name name; 
    name.length(1); 

    name[0].id = (const char*) "birdseye";  // string copied 
    name[0].kind = (const char*) "collections_context"; // string copied 
    // Note on kind: The kind field is used to indicate the type 
    // of the object. This is to avoid conventions such as that used 
    // by files (name.type -- e.g. test.ps = postscript etc.) 


    try { 
    // Resolve the name to an object reference. 
    return rootContext->resolve(name); 
    } 
    catch(CosNaming::NamingContext::NotFound& nf) { 
    } 
    catch(CORBA::COMM_FAILURE&) { 
    } 
    catch(CORBA::SystemException&) { 
    } 

    return CORBA::Object::_nil(); 
} 

UPDATE-05.00: Infact der Server-Side-Code hat auch gleiche Problem server-> authenticate wird nie wegen Null Referenz bezeichnet.

Rate: Kann es ein Problem mit Proxy & Stubs geben, die mit idl2cpp tool generiert werden?

UPDATE-7: 30PM Die Zweideutigkeit auf Stubs nicht ok auch das Problem verschwunden ist, bleibt nach wie vor nach dem Stubs & Regenerieren wieder sowohl Client- Server-Anwendungen & Wiederaufbau

UPDATE 31.03 | 11.00 Uhr Ich benutze OmniORB 4.0.3, das über 10 Jahre alt ist. Dies hat in früheren Versionen von Windows OS, die mit VC6 kompiliert wurden, sehr gut funktioniert. Ich bezweifle, dass es ein Problem gibt, wenn es auf VS 2008 neu kompiliert wurde. Ich denke nur an ein Upgrade auf ommiORB 4.2, das letztes Jahr veröffentlicht wurde. Nur ahnungslos auch immer ...

UPDATE 31.03 | 5: 30PM Derzeit bauen omniORB4.2.1 Quellcode. Während ich dies tue, möchte ich immer noch wissen, ob es ein Problem gibt, das die .lib-Dateien verbindet, die in älteren Systemen erzeugt werden. In diesem Fall basieren die omniORB .lib-Dateien, die ich in Windows 7 verwende, auf Windows XP, wäre das ein Problem? Auch this Post konnte nicht antworten, ich habe eine alte Lib, die & gut ohne Probleme verbunden zusammengestellt & auch die Laufzeit es nicht so gut

UPDATE 01.04 Absturz habe | 4: 30PM Eigentlich gibt bemerkte ich, ist kein Server läuft, der Server-Code, den ich früher gepostet habe, ist auch Client, ich habe jetzt echten Server-Code aktualisiert (der Code, der Name an Server-Obj bindet). Aber das Problem bleibt gleich, auch nach dieser Korrektur

+0

So ist das 'obj' Variable zurückgegeben aus 'getObjectReference' ist nicht' nil'? Sie ignorieren die Ausnahme "CosNaming :: NamingContext :: NotFound", so dass sie "nil" wäre, wenn sie nicht gefunden wird. Dies ist das Problem, Sie können das Dienstprogramm 'nameclt' verwenden, um zu prüfen, was im Namensdienst enthalten ist. – pcarter

+0

@pcarter Danke für einen flüchtigen Blick, das Steuerelement geht nicht in NotFound Ausnahme, ich habe dies mit Debugger bestätigt. Eigentlich ist der Servercode nicht der eigentliche Servercode. Aber auch nach dem Ausführen des echten Servercodes bleibt immer noch das gleiche Problem übrig. Server-Code in der Post aktualisiert – Naga

Antwort

0

Endlich habe ich das Problem behoben. Es gibt 2 Probleme mit dem Code Problem 1 Ich bereits in Frage (fehlende Server-Code) aktualisiert Problem 2 ist mit dem Namen Kontextbindung ..

unten ist Version von bindObjectToName

static CORBA::Boolean 
bindObjectToName(CORBA::ORB_ptr orb, CORBA::Object_ptr objref) 
{ 
    CosNaming::NamingContext_var rootContext; 

    try { 
    // Obtain a reference to the root context of the Name service: 
    CORBA::Object_var obj; 
    obj = orb->resolve_initial_references("NameService"); 

    // Narrow the reference returned. 
    rootContext = CosNaming::NamingContext::_narrow(obj); 
    if(CORBA::is_nil(rootContext)) { 
//  cerr << "Failed to narrow the root naming context." << endl; 
     return 0; 
    } 
    } 
    catch(CORBA::ORB::InvalidName& ex) { 
    // This should not happen! 
    // cerr << "Service required is invalid [does not exist]." << endl; 
    return 0; 
    } 

    try { 
    // Bind a context called "test" to the root context: 

    CosNaming::Name contextName; 
    contextName.length(1); 
    contextName[0].id = (const char*) "birdsEYE";  // string copied 
    contextName[0].kind = (const char*) "DataCollectionS"; // string copied 
    // Note on kind: The kind field is used to indicate the type 
    // of the object. This is to avoid conventions such as that used 
    // by files (name.type -- e.g. test.ps = postscript etc.) 

    CosNaming::NamingContext_var testContext; 
    try { 
     // Bind the context to root. 
     testContext = rootContext->bind_new_context(contextName); 
    } 
    catch(CosNaming::NamingContext::AlreadyBound& ex) { 
     // If the context already exists, this exception will be raised. 
     // In this case, just resolve the name and assign testContext 
     // to the object returned: 
     CORBA::Object_var obj; 
     obj = rootContext->resolve(contextName); 
     testContext = CosNaming::NamingContext::_narrow(obj); 
     if(CORBA::is_nil(testContext)) { 
    // cerr << "Failed to narrow naming context." << endl; 
     return 0; 
     } 
    } 

    // Bind sender : 
    CosNaming::Name objectName; 
    objectName.length(1); 
    objectName[0].id = (const char*) "clienT"; // string copied 
    objectName[0].kind = (const char*) "sendeR"; // string copied 

    try { 
     testContext->bind(objectName, objref); 
    } 
    catch(CosNaming::NamingContext::AlreadyBound& ex) { 
     testContext->rebind(objectName, objref); 
    } 
    // Note: Using rebind() will overwrite any Object previously bound 
    //  to /test/Echo with obj. 
    //  Alternatively, bind() can be used, which will raise a 
    //  CosNaming::NamingContext::AlreadyBound exception if the name 
    //  supplied is already bound to an object. 

    // Bind receiver : 
    CosNaming::Name objectName2; 
    objectName2.length(1); 
    objectName2[0].id = (const char*) "clienT"; // string copied 
    objectName2[0].kind = (const char*) "receiveR"; // string copied 

    try { 
     testContext->bind(objectName2, objref); 
    } 
    catch(CosNaming::NamingContext::AlreadyBound& ex) { 
     testContext->rebind(objectName2, objref); 
    } 


    // Amendment: When using OrbixNames, it is necessary to first try bind 
    // and then rebind, as rebind on it's own will throw a NotFoundexception if 
    // the Name has not already been bound. [This is incorrect behaviour - 
    // it should just bind]. 

    } 
    catch(CORBA::COMM_FAILURE& ex) { 
    //cerr << "Caught system exception COMM_FAILURE -- unable to contact the " 
    //  << "naming service." << endl; 
    return 0; 
    } 
    catch(CORBA::SystemException&) { 
    //cerr << "Caught a CORBA::SystemException while using the naming service." 
    // << endl; 
    return 0; 
    } 

    return 1; 
} 

Und unter der modifizierten getObjectReference in Client-Code statischen CORBA :: Object_ptr in Server geändert

getObjectReference(CORBA::ORB_ptr orb) 
{ 
    CosNaming::NamingContext_var rootContext; 

    try { 
    // Obtain a reference to the root context of the Name service: 
    CORBA::Object_var obj; 
    obj = orb->resolve_initial_references("NameService"); 

    // Narrow the reference returned. 
    rootContext = CosNaming::NamingContext::_narrow(obj); 
    if(CORBA::is_nil(rootContext)) { 
//  cerr << "Failed to narrow the root naming context." << endl; 
     return CORBA::Object::_nil(); 
    } 
    } 
    catch(CORBA::ORB::InvalidName& ex) { 
    // This should not happen! 
    // cerr << "Service required is invalid [does not exist]." << endl; 
    _BRDTRACE("getObjRef: service required is invalid.\n"); 
    exit(0); 
    return CORBA::Object::_nil(); 
    } 


    // Create a name object, containing the name test/context: 
    CosNaming::Name name; 
    name.length(2); 

    name[0].id = (const char*) "birdsEYE";  // string copied 
    name[0].kind = (const char*) "DataCollectionS"; // string copied 
    name[1].id = (const char*) "clienT"; 
    name[1].kind = (const char*) "sendeR"; 
    // Note on kind: The kind field is used to indicate the type 
    // of the object. This is to avoid conventions such as that used 
    // by files (name.type -- e.g. test.ps = postscript etc.) 


    try { 
    // Resolve the name to an object reference. 
    return rootContext->resolve(name); 
    } 
    catch(CosNaming::NamingContext::NotFound& ex) { 
    // This exception is thrown if any of the components of the 
    // path [contexts or the object] aren't found: 
    //cerr << "Context not found." << endl; 
    _BRDTRACE("getObjRef: context not found.\n"); 
    exit(0); 
    } 
    catch(CORBA::COMM_FAILURE& ex) { 
    //cerr << "Caught system exception COMM_FAILURE -- unable to contact the " 
    // << "naming service." << endl; 
    _BRDTRACE("getObjRef: caught system exception COMM_FAILURE.\n"); 
    exit(0); 
    } 
    catch(CORBA::SystemException&) { 
    //cerr << "Caught a CORBA::SystemException while using the naming service." 
    //<< endl; 
    _BRDTRACE("getObjRef: caught system exception while using the name service.\n"); 
    exit(0); 
    } 

    return CORBA::Object::_nil(); 
} 
Verwandte Themen