Précédent   Forum du club des développeurs et IT Pro > Autres langages > Autres langages > CORBA
CORBA Forum d'entraide et de discussion sur le développement distribué avec CORBA & les ORB
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 20/01/2011, 18h07   #1
amineabm
Invité de passage
 
Amine ABM
Inscription : novembre 2010
Messages : 17
Détails du profil
Informations personnelles :
Nom : Amine ABM

Informations forums :
Inscription : novembre 2010
Messages : 17
Points : 3
Points : 3
Par défaut Error Resolve (NameService) .

Hello

I am writing a program to communicate with an existing one using CORBA.

After i Create a name object, containing the name test/context:
CosNaming::Name name;
name.length(1);
name[0].id = m_ServerName.c_str();
name[0].kind = m_ServerKind.c_str();

then I try to resolve the name service using:
return rootContext->resolve(name);

it doesn't catch errors.

But when i narrow the object reference:
serverPtr = SOT_Server_Command::_narrow(corba_obj);

CORBA::is_nil(serverPtr) error is catched !!!!

i can't understand why the resolve name didnt give errors but when i narrow the object reference i get nill result.

Thank you for the help.

P.S: Source files given in Private message.
amineabm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 10h44   #2
CorbAddict
Membre éclairé
 
Homme Julien Enoch
Architecte technique
Inscription : septembre 2006
Messages : 219
Détails du profil
Informations personnelles :
Nom : Homme Julien Enoch
Âge : 37
Localisation : France

Informations professionnelles :
Activité : Architecte technique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2006
Messages : 219
Points : 308
Points : 308
Hi,

The object reference you get from NameService is certainly not of SOT_Server_Command type. That's why narrow operation returns nil.

You could check the type of the object you get with following code:
Citation:
CORBA::String_var s = corba_obj->repository_id();
std::cout << "corba_obj type is: " << s.in() << std::end;
P.S.: This is a French forum. If you have some knowledge of French, please use it.
CorbAddict est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 10h51   #3
amineabm
Invité de passage
 
Amine ABM
Inscription : novembre 2010
Messages : 17
Détails du profil
Informations personnelles :
Nom : Amine ABM

Informations forums :
Inscription : novembre 2010
Messages : 17
Points : 3
Points : 3
Merci pour votre réponse et désolé pour l'anglais.

J'ai ajouté votre code pour voir le type de l'objet, j'ai eu cette erreur:

Citation:
‘class CORBA::Object’ has no member named ‘repository_id’
Note: j'utilise le C++

Merci pour votre aide.
amineabm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 11h48   #4
CorbAddict
Membre éclairé
 
Homme Julien Enoch
Architecte technique
Inscription : septembre 2006
Messages : 219
Détails du profil
Informations personnelles :
Nom : Homme Julien Enoch
Âge : 37
Localisation : France

Informations professionnelles :
Activité : Architecte technique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2006
Messages : 219
Points : 308
Points : 308
Désolé, j'ai fait une petite erreur. Voici le bon code (noter le '_' devant repository_id):
Code :
1
2
3
CORBA::String_var s = corba_obj->_repository_id();
std::cout << "corba_obj type is: " << s.in() << std::end;
CorbAddict est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 12h49   #5
amineabm
Invité de passage
 
Amine ABM
Inscription : novembre 2010
Messages : 17
Détails du profil
Informations personnelles :
Nom : Amine ABM

Informations forums :
Inscription : novembre 2010
Messages : 17
Points : 3
Points : 3
J'ai encore la même erreur!!!

Code :
1
2
3
4
FoxCommander.cpp: In function ‘int main(int, char**)’:
FoxCommander.cpp:307: error: ‘class CORBA::Object’ has no member named ‘_repository_id’
FoxCommander.cpp:308: error: ‘end’ is not a member of ‘std’
make: *** [FoxCommander.o] Erreur 1
amineabm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 17h37   #6
CorbAddict
Membre éclairé
 
Homme Julien Enoch
Architecte technique
Inscription : septembre 2006
Messages : 219
Détails du profil
Informations personnelles :
Nom : Homme Julien Enoch
Âge : 37
Localisation : France

Informations professionnelles :
Activité : Architecte technique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2006
Messages : 219
Points : 308
Points : 308
Alors c'est que malheureusement votre ORB n'est pas à jour avec le standard "C++ language mapping"
Quel ORB utilisez-vous ?

De toutes façons, si corba_obj n'est pas null, et que SOT_Server_Command::_narrow(corba_obj) retourne null, c'est que corba_obj n'est pas du type SOT_Server_Command.
Vérifiez quel est le type de l'objet stocké dans le NameService.
CorbAddict est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 18h24   #7
amineabm
Invité de passage
 
Amine ABM
Inscription : novembre 2010
Messages : 17
Détails du profil
Informations personnelles :
Nom : Amine ABM

Informations forums :
Inscription : novembre 2010
Messages : 17
Points : 3
Points : 3
J'utilise le omniORB-4.1.4.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CORBA::Object_ptr corba_obj = corbaConnectionHandler->getObjectReference();

//in another file the  corbaConnectionHandler is defined to return "CORBA::Object_ptr" such as:
  
CosNaming::Name name;
  name.length(1);
  name[0].id   = "sot";
  name[0].kind = "context";

  return rootContext->resolve(name);
// ------------------------------------

sot_serverPtr = SOT_Server_Command::_narrow(corba_obj);

      if(CORBA::is_nil( sot_serverPtr ) )
	{
	  sotERROR <<"Server ptr is null: connection is not obtained. " <<std::endl;
	  return NULL;
	}
C'est cette erreur qui est donnée par le programme .

Comment Vérifiez quel est le type de l'objet stocké dans le NameService?

Merci beaucoup pour votre aide.
amineabm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 11h10   #8
CorbAddict
Membre éclairé
 
Homme Julien Enoch
Architecte technique
Inscription : septembre 2006
Messages : 219
Détails du profil
Informations personnelles :
Nom : Homme Julien Enoch
Âge : 37
Localisation : France

Informations professionnelles :
Activité : Architecte technique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2006
Messages : 219
Points : 308
Points : 308
Une question d'abord:
Je ne vois pas de test pour vérifier que corba_obj n'est pas nil !
Etes-vous sûr qu'il ne l'est pas ?

Si oui, Vous pouvez essayer 2 choses:

1: le CORBA::Object d'OmniORB à un attribut non-standard _PD_repoId
Si OmniORB fonctionne comme je le suppose, cet attribut contient le RepositoryID (i.e. le nom du type) de l'objet.
Donc:
Code :
1
2
std::cout << "corba_obj RepositoryID = " << corba_obj->_PD_repoId << std::endl;
2: OmniORB a un outil nommé catior qui permet de décoder un IOR et donc d'afficher son type.
Il faut d'abord afficher l'IOR de l'objet:
Code :
1
2
3
4
// Requires ORB variable
CORBA::String_var s = orb->object_to_string(corba_obj);
std::cout << "corba_obj IOR:\n" << s.in() << std::endl;
Puis appeler la commande catior avec l'IOR affiché:
CorbAddict est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 11h38   #9
amineabm
Invité de passage
 
Amine ABM
Inscription : novembre 2010
Messages : 17
Détails du profil
Informations personnelles :
Nom : Amine ABM

Informations forums :
Inscription : novembre 2010
Messages : 17
Points : 3
Points : 3
Oui je fait un test " if(CORBA::is_nil( corba_obj ) ) " mais il n'y a pas de problemes.

Pour le type de corba_obj:

j'ai trouvé:
corba_obj RepositoryID = IDL:omg.org/CORBA/Object:1.0

Pourquoi il n'est pas de type sot_server_command??!!
D'habitude le "resolve(name)" retourne un objet de quel type ??!!
amineabm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 11h52   #10
CorbAddict
Membre éclairé
 
Homme Julien Enoch
Architecte technique
Inscription : septembre 2006
Messages : 219
Détails du profil
Informations personnelles :
Nom : Homme Julien Enoch
Âge : 37
Localisation : France

Informations professionnelles :
Activité : Architecte technique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2006
Messages : 219
Points : 308
Points : 308
C'est sans doute que OmniORB ne stocke malheureusement pas le type réel de l'objet dans son attribut _PR_repoId.
Ma première option n'est donc pas la bonne.

Essayez la 2e avec catior.

Citation:
Pourquoi il n'est pas de type sot_server_command??!!
Il est peut-être aussi de ce type là! CORBA::Object est le type de base dont héritent tout les objets CORBA.

Citation:
D'habitude le "resolve(name)" retourne un objet de quel type ??!!
Ca retourne toujours un CORBA::Object. C'est bien pour ça qu'il faut faire un narrow pour le "caster" dans le type dont on pense qu'il est réellement.
CorbAddict est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/01/2011, 14h02   #11
amineabm
Invité de passage
 
Amine ABM
Inscription : novembre 2010
Messages : 17
Détails du profil
Informations personnelles :
Nom : Amine ABM

Informations forums :
Inscription : novembre 2010
Messages : 17
Points : 3
Points : 3
J'ai eu ce résultat avec catior:

Code :
1
2
3
4
5
6
7
8
9
Type ID: "IDL:hppCorbaServer/SOT_Server_Command:1.0"
Profiles:
1. IIOP 1.2 172.27.11.79 39153 "...>M..Q......"
            TAG_ORB_TYPE omniORB
            TAG_CODE_SETS char native code set: ISO-8859-1
                          char conversion code set: UTF-8
                          wchar native code set: UTF-16
                          wchar conversion code set: UTF-16
Désolé , mais je ne comprends pas tous ce qu'elle donne!!!
Il est bien de type SOT_Server_Command ...

C'est ou le problème dans mon code alors ?!!
amineabm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 15h26   #12
CorbAddict
Membre éclairé
 
Homme Julien Enoch
Architecte technique
Inscription : septembre 2006
Messages : 219
Détails du profil
Informations personnelles :
Nom : Homme Julien Enoch
Âge : 37
Localisation : France

Informations professionnelles :
Activité : Architecte technique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2006
Messages : 219
Points : 308
Points : 308
Cela donne que le RepositoryID de l'objet est IDL:hppCorbaServer/SOT_Server_Command

Avec "hppCorbaServer" qui est soit un module, soit un pragma prefix.
Quel est le contenu de l'IDL ?
l'IDL du client et du serveur sont-ils tout les deux compilés avec OmniORB ?
Avec quelles options ?

Que donne le code suivant ?
Citation:
if (corba_obj->_is_a("IDL:hppCorbaServer/SOT_Server_Command:1.0"))
std::cout << "corba_obj is a IDL:hppCorbaServer/SOT_Server_Command:1.0" << std::endl;
else
std::cout << "corba_obj is NOT a IDL:hppCorbaServer/SOT_Server_Command:1.0" << std::endl;
Dans le code généré par OmniORB pour SOT_Server_Command, y a-t-il une chaîne de caractères qui ressemble à un RepositoryID (IDL:...SOT_Server_Command:1.0) ?
Quelle est-elle ?
CorbAddict est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/01/2011, 19h07   #13
amineabm
Invité de passage
 
Amine ABM
Inscription : novembre 2010
Messages : 17
Détails du profil
Informations personnelles :
Nom : Amine ABM

Informations forums :
Inscription : novembre 2010
Messages : 17
Points : 3
Points : 3
J'ai trouvé et fixé la première erreur . En fait, c'etait pas le bon fichier idl que je compile avec le programme.
J'utilise : omniidl -bcxx filename.idl

dans le fichier IDL, il y a:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  interface SOT_Server_Command
  {
    void run( in string cmd );
    void runAndRead( in string cmd, out StringStreamer os );
    void readVector( in string signalName, out DoubleSeq value );

    long createOutputVectorSignal( in string signalNameCorba );
    long createInputVectorSignal( in string signalNameCorba );
    void readInputVectorSignal( in long signalRank, out DoubleSeq value );
    void writeOutputVectorSignal( in long signalRank, in DoubleSeq value );

    // RegisterCallback
    void registerClient(in NotifyCallback client, in string clientName );
    void unregisterClient(in string clientName);
  };
Le probleme est que maintenant le programme donne une erreur directement apres le :
" return resolve (name) " qui est bien de type "Type ID: "IDL:hppCorbaServer/SOT_Server_Command:1.0".

Il donne une erreur même avant le "_narrow(corba_obj)"

Note: Le corba_obj n'est pas nill ...
amineabm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 10h06   #14
amineabm
Invité de passage
 
Amine ABM
Inscription : novembre 2010
Messages : 17
Détails du profil
Informations personnelles :
Nom : Amine ABM

Informations forums :
Inscription : novembre 2010
Messages : 17
Points : 3
Points : 3
Bonjour

Merci beaucoup pour votre aide.
Le problème est résolu .. c'était pas le bon fichier idl que j'utilise.

J'ai une dernière question SVP:
Je peux changer dans le fichier idl du client (ajouter une définition de quelque chose sans modifier la hiérarchie)?

C'est possible que le fichier .idl du serveur soit différent de celui du client ?
amineabm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 16h36   #15
CorbAddict
Membre éclairé
 
Homme Julien Enoch
Architecte technique
Inscription : septembre 2006
Messages : 219
Détails du profil
Informations personnelles :
Nom : Homme Julien Enoch
Âge : 37
Localisation : France

Informations professionnelles :
Activité : Architecte technique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2006
Messages : 219
Points : 308
Points : 308
Bonjour,

Citation:
C'est possible que le fichier .idl du serveur soit différent de celui du client ?
C'est possible, mais dangereux !
Si les définitions des types et interfaces utilisées par le client ET le serveur ne sont pas exactement les mêmes, le comportement est indéterminé et on peut avoir des erreurs vraiment bizarres (selon les ORBs utilisés)...

Mon conseil est de toujours utiliser le même IDL côté client et serveur.
Et si on change l'IDL, ne pas oublier de re-générer le code pour les 2 côtés !!
CorbAddict est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/01/2011, 18h33   #16
maestro1303
Nouveau Membre du Club
 
Inscription : juillet 2006
Messages : 117
Détails du profil
Informations personnelles :
Âge : 38

Informations forums :
Inscription : juillet 2006
Messages : 117
Points : 30
Points : 30
Bonjour à tous,

Tout d'abord excusez mon ignorance de corba et mon manque de culture dans les environnements/outils de développement.

Ma question est : y a -t-il un moyen de comprendre corba sans utiliser java ou C++?


Mes prérequis sont TCP/IP, SGBD, scripting(light), vba etc...

Merci infiniment de votre compréhension et de vos excuses de cette interférence de l'ignorance dans cet océan de technologies!
maestro1303 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 11h27   #17
CorbAddict
Membre éclairé
 
Homme Julien Enoch
Architecte technique
Inscription : septembre 2006
Messages : 219
Détails du profil
Informations personnelles :
Nom : Homme Julien Enoch
Âge : 37
Localisation : France

Informations professionnelles :
Activité : Architecte technique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2006
Messages : 219
Points : 308
Points : 308
Bonjour,

Citation:
Ma question est : y a -t-il un moyen de comprendre corba sans utiliser java ou C++?
Comprendre les principes de base de CORBA: oui
La spécification CORBA elle même n'est liée à aucun langage (à part l'IDL).

Après pour utiliser CORBA, il faut forcément un langage de programmation (C ou C++ ou Java ou Ada ...)

Citation:
Mes prérequis sont TCP/IP, SGBD, scripting(light), vba etc...
Aucun besoin de ces connaissances pour CORBA.
A part peut-être Visual Basic, car il existe un ORB pour ce langage: VBOrb
Mais il a l'air assez vieux (2003) et je ne sais pas ce qu'il vaut...
CorbAddict est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 17h59   #18
maestro1303
Nouveau Membre du Club
 
Inscription : juillet 2006
Messages : 117
Détails du profil
Informations personnelles :
Âge : 38

Informations forums :
Inscription : juillet 2006
Messages : 117
Points : 30
Points : 30
Merci infiniment,

Une réponse de ce genre donne envie de rester sur ce forum qui, à mon propre avis est le meilleur.


Merci.
maestro1303 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h24.


 
 
 
 
Partenaires

Hébergement Web