CORBA omniORB在解析名称上下文后无法获取远程对象



我有一个IDL,如下

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();
  };
};

为此我生成了proxy&使用idl2cpp实用程序(onmiORB)的骨架,并将生成的文件链接到服务器&文件中建议的客户端应用程序

然后我启动了名称服务(omniNames),并按照服务器文档中的建议添加了注册表项omniORB\InittRef;客户端应用程序在不使用命令行参数的情况下进行连接

下面是服务器代码

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("bindedn");
        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;
}

但是客户端的以下代码在名称后返回nil对象上下文解析。无法解决问题。请帮忙

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();
}

更新-5PM:事实上,服务器端代码也有同样的问题,由于没有引用,服务器->身份验证从未被调用。

猜测:代理会有问题吗;使用idl2cpp工具生成的存根?

更新时间-7:30PM存根上的模糊性也消失了,在重新生成存根&重建客户端&服务器应用程序再次

更新3-31|11AM我正在使用omniORB 4.0.3,它已经有10多年的历史了。这在使用VC6编译的早期windows操作系统版本中效果很好,我怀疑在VS2008上重新编译时是否存在问题。只是想升级到去年发布的commiorB4.2。只是一无所知。。。

更新3-31|5:30PM目前正在构建omniORB4.2.1源代码。当我这样做的时候,我仍然想知道链接在旧系统中生成的.lib文件是否有任何问题。在这种情况下,我在Windows7中使用的omniORB.lib文件是在WindowsXP上构建的,这会是一个问题吗?即使这篇文章也无法回答,我有一个旧的.lib,它编译了&链接良好,没有任何问题&即使在运行时,也没有崩溃

更新4-01|4:30PM事实上,我注意到没有服务器在运行,我之前发布的服务器代码也是客户端,我现在更新了真实的服务器代码(将名称绑定到服务器obj的代码)。但即使经过此校正,问题仍然存在

最后我解决了这个问题。代码有2个问题问题1我已经更新了(缺少服务器代码)问题2与名称上下文绑定有关。。

下面是服务器中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;
}

以及客户端代码中修改后的getObjectReference下方静态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& 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();
}

相关内容

  • 没有找到相关文章

最新更新