IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[gSoap] Compiler un serveur lui même client de plusieurs serveurs (Linux)


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 17
    Points
    17
    Par défaut [gSoap] Compiler un serveur lui même client de plusieurs serveurs (Linux)
    Bonjour à tous,

    Je suis en train de créer un webservice qui est chargé d'interroger plusieurs autres webservices.

    J'ai d'abord créé chacun des webservices "esclaves" sous la forme de cgi-bin, et ai obtenu leurs wsdl.

    J'ai suivi la méthode de la documentation gSoap suivante pour atteindre plusieurs webservices depuis un seul et même client :

    http://www.cs.fsu.edu/~engelen/soapd...tth_sEc19.36.1

    J'ai donc procédé comme suit :

    Dans le répertoire du WebService Maitre (/WSMaster) :

    Création d'un fichier env.h vide et compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ./soapcpp2 -penv env.h
    c++ -c envC.cpp
    Compilation de stdsoap2.cpp sans namespaces :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c++ -c -DWITH_NONAMESPACES stdsoap2.cpp
    Copie des headers de chacun des webservices esclaves dans le répertoire maitre et ajout d'un namespace sur chacun des headers comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // File: wsMail.h
    namespace wsMail
    {
    //gsoap ns service name: wsMail 
    //gsoap ns service namespace: urn:wsMail 
    //gsoap ns service location: http://adresse_du_webservice/slave.cgi
     
    #include <string>
     
    int ns__sendMail(int *r);
    int ns__sendMailTo(std::string mailBrut, std::string mailFrom, std::string mailTo, int *r);
    int ns__getCpuLoad(int *r);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // File: wsMailSlave1.h
    namespace wsMailSlave1
    {
    //gsoap ns service name: wsMailSlave1 
    //gsoap ns service namespace: urn:wsMailSlave1 
    //gsoap ns service location: http://ADRESSE_WEB_SERVICE/slave1.cgi
     
    #include <string>
     
    int ns__sendMail(int *r);
    int ns__sendMailTo(std::string mailBrut, std::string mailFrom, std::string mailTo, int *r);
    int ns__getCpuLoad(int *r);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // File: wsMailSlave2.h
    namespace wsMailSlave2
    {
    //gsoap ns service name: wsMailSlave2 
    //gsoap ns service namespace: urn:wsMailSlave2 
    //gsoap ns service location: http://ADRESSE_DU_WEBSERVICE/cgi-bin/slave2.cgi
     
    #include <string>
     
    int ns__sendMail(int *r);
    int ns__sendMailTo(std::string mailBrut, std::string mailFrom, std::string mailTo, int *r);
    int ns__getCpuLoad(int *r);
    }
    Puis, compilation de chacun de ces fichiers headers en tant que bibliothèque avec l'option -n pour renommer la table de namespaces :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ./soapcpp2 -n wsMail.h 
    c++ -c wsMailClientLib.cpp
     
    ./soapcpp2 -n wsMailSlave1.h 
    c++ -c wsMailMailSlave1ClientLib.cpp
     
    ./soapcpp2 -n wsMailSlave2.h 
    c++ -c wsMailSlave2ClientLib.cpp
    Ensuite, je link les bibliothèques au webservice maitre en utilisant les fichiers "..."Proxy.h de chacun des esclaves :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    #include <iostream>
    #include <string>
     
    #include "smtp.h"
    #include "soapH.h"
    #include "soapStub.h"
     
    #include "wsMaster.nsmap"
    #include "getCpuStat.h"
     
    #include "wsMailwsMailProxy.h"
    #include "wsMailSlave1wsMailSlave1Proxy.h"
    #include "wsMailSlave2wsMailSlave2Proxy.h"
    #include "wsMail.nsmap"
    #include "wsMailSlave1.nsmap"
    #include "wsMailSlave2.nsmap"
     
     
     
     
    //using namespace std;
     
    int main()
    {   
        // create soap context and serve one CGI-based request: 
       return soap_serve(soap_new()); 
    }
     
    int ns__sendMail(struct soap *soap, int *r)
    {
        ...
    }
     
    int ns__sendMailTo(struct soap *soap, std::string mailBrut, std::string mailFrom, std::string mailTo, int *r)
    {
      ...  
    }
     
    int ns__getCpuLoad(struct soap *soap, int *r)
    {
    	...
    }
     
    int ns__getLessLoadedServer(struct soap *soap, std::string *wsdl)
    {
    	wsMail::wsMail ws;
    	int wsCpu = 100;
    	ws.ns__getCpuLoad(&wsCpu);
     
    	wsMailSlave1::wsMailSlave1 ws1;
    	int ws1Cpu = 100;
    	ws1.ns__getCpuLoad(&ws1Cpu);
     
    	wsMailSlave2::wsMailSlave2 ws2;
    	int ws2Cpu = 100;
    	ws2.ns__getCpuLoad(&ws2Cpu);
     
    "......"
     
    	return SOAP_OK;
    }
    Enfin, d'après la documentation, je suis sensé compiler et linker le client avec stdsoap2.o, envC.o, wsMailwsMailProxy.o, wsMailSlave1wsMailSlave1Proxy.o, et wsMailSlave2wsMailSlave2Proxy.o.

    Le problème est que les fichiers "..."Proxy.o ne sont pas créés en suivant les étapes données par la documentation gSoap, puisque nous ne compilons pas les fichiers "..."Proxy.h

    Je tente donc la commande suivante pour compiler mon maitre (main.cpp) lui même webService avec les fichiers "..."Proxy.h afin d'accéder aux webservices esclaves :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c++ -o wsMaster.cgi main.cpp smtp.h explode.h getCpuStat.h stringToInt.h soapC.cpp soapH.h soapServer.cpp stdsoap2.cpp wsMailwsMailProxy.h wsMailSlave1wsMailSlave1Proxy.h wsMailSlave2wsMailSlave2Proxy.h
    Voici le résultat de la compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    /tmp/cc03tcd8.o: In function `wsMail::wsMail::ns__sendMailTo(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int*)':
    main.cpp:(.text._ZN6wsMail6wsMail14ns__sendMailToESsSsSsPi[wsMail::wsMail::ns__sendMailTo(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int*)]+0xba): undefined reference to `wsMail::soap_call_ns__sendMailTo(soap*, char const*, char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int*)'
    /tmp/cc03tcd8.o: In function `wsMail::wsMail::ns__sendMail(int*)':
    main.cpp:(.text._ZN6wsMail6wsMail12ns__sendMailEPi[wsMail::wsMail::ns__sendMail(int*)]+0x37): undefined reference to `wsMail::soap_call_ns__sendMail(soap*, char const*, char const*, int*)'
    /tmp/cc03tcd8.o: In function `wsMail::wsMail::ns__getCpuLoad(int*)':
    main.cpp:(.text._ZN6wsMail6wsMail14ns__getCpuLoadEPi[wsMail::wsMail::ns__getCpuLoad(int*)]+0x37): undefined reference to `wsMail::soap_call_ns__getCpuLoad(soap*, char const*, char const*, int*)'
    /tmp/cc03tcd8.o: In function `wsMailSlave1::wsMailSlave1::ns__sendMailTo(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int*)':
    main.cpp:(.text._ZN12wsMailSlave112wsMailSlave114ns__sendMailToESsSsSsPi[wsMailSlave1::wsMailSlave1::ns__sendMailTo(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int*)]+0xba): undefined reference to `wsMailSlave1::soap_call_ns__sendMailTo(soap*, char const*, char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int*)'
    /tmp/cc03tcd8.o: In function `wsMailSlave1::wsMailSlave1::ns__sendMail(int*)':
    main.cpp:(.text._ZN12wsMailSlave112wsMailSlave112ns__sendMailEPi[wsMailSlave1::wsMailSlave1::ns__sendMail(int*)]+0x37): undefined reference to `wsMailSlave1::soap_call_ns__sendMail(soap*, char const*, char const*, int*)'
    /tmp/cc03tcd8.o: In function `wsMailSlave1::wsMailSlave1::ns__getCpuLoad(int*)':
    main.cpp:(.text._ZN12wsMailSlave112wsMailSlave114ns__getCpuLoadEPi[wsMailSlave1::wsMailSlave1::ns__getCpuLoad(int*)]+0x37): undefined reference to `wsMailSlave1::soap_call_ns__getCpuLoad(soap*, char const*, char const*, int*)'
    /tmp/cc03tcd8.o: In function `wsMailSlave2::wsMailSlave2::ns__sendMailTo(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int*)':
    main.cpp:(.text._ZN12wsMailSlave212wsMailSlave214ns__sendMailToESsSsSsPi[wsMailSlave2::wsMailSlave2::ns__sendMailTo(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int*)]+0xba): undefined reference to `wsMailSlave2::soap_call_ns__sendMailTo(soap*, char const*, char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int*)'
    /tmp/cc03tcd8.o: In function `wsMailSlave2::wsMailSlave2::ns__sendMail(int*)':
    main.cpp:(.text._ZN12wsMailSlave212wsMailSlave212ns__sendMailEPi[wsMailSlave2::wsMailSlave2::ns__sendMail(int*)]+0x37): undefined reference to `wsMailSlave2::soap_call_ns__sendMail(soap*, char const*, char const*, int*)'
    /tmp/cc03tcd8.o: In function `wsMailSlave2::wsMailSlave2::ns__getCpuLoad(int*)':
    main.cpp:(.text._ZN12wsMailSlave212wsMailSlave214ns__getCpuLoadEPi[wsMailSlave2::wsMailSlave2::ns__getCpuLoad(int*)]+0x37): undefined reference to `wsMailSlave2::soap_call_ns__getCpuLoad(soap*, char const*, char const*, int*)'
    collect2: ld returned 1 exit status
    Si quelqu'un peut m'apporter l'étincelle qui me permettra d'arriver au bout de ce problème, cela serai très sympa, je suis dessus depuis 2 jours

    Merci de m'avoir lu !

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    peut-être une piste:
    si mes souvenirs sont bons (ça fait longtemps que je n'ai pas touché à gSoap), les fonctions soap_call_ns__xxx sont déclarées dans le stub. Vérifie donc que ton en-tête stub est bien inclus où il se doit.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par r0d Voir le message
    Bonjour,

    peut-être une piste:
    si mes souvenirs sont bons (ça fait longtemps que je n'ai pas touché à gSoap), les fonctions soap_call_ns__xxx sont déclarées dans le stub. Vérifie donc que ton en-tête stub est bien inclus où il se doit.
    Bonjour et merci pour ta réponse.

    Désolé de ne pas avoir répondu plus tôt, j'ai dû avancer dans mon projet.

    Je n'ai pas vérifié la bonne inclusion du stub, je vous tiendrai au courant dès que j'aurai avancé là dessus.

    Merci,

    Niusha.

Discussions similaires

  1. [Batch] Exécuter des commandes sur plusieurs serveurs en même temps
    Par Med_be dans le forum Scripts/Batch
    Réponses: 7
    Dernier message: 27/03/2015, 19h05
  2. Réponses: 4
    Dernier message: 27/09/2009, 20h22
  3. Réponses: 0
    Dernier message: 07/08/2009, 16h57
  4. developper un client de plusieurs serveur avec l'api corba du jdk1.6
    Par moffale dans le forum API standards et tierces
    Réponses: 0
    Dernier message: 07/08/2009, 16h32
  5. Client FTP et serveur FTP sur même poste
    Par Remedy dans le forum Internet
    Réponses: 5
    Dernier message: 14/06/2006, 19h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo