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
Kommandozeileist 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
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
@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