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

Bibliothèques C++ Discussion :

[gSoap] Création d'un serveur standalone et le client correspondant


Sujet :

Bibliothèques C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 83
    Par défaut [gSoap] Création d'un serveur standalone et le client correspondant
    Bonsoir,

    Je n'ai plus fait de C++ depuis plus de 3 ans, et je dois créer un webservice en C++, j'ai choisi pour cela gSOAP. De plus il est très important que cela soit fait en standalone, je ne souhaite pas utiliser de serveur web externe(apache, IIS, ...) pour publier mes webservices. Dans l'exemple webserver de gSOAP je crois que c'est ce que je souhaite mais j'ai beaucoup de mal a comprendre comment il fonctionne.
    Pour être honnête je suis au point ou même créer un client ça me parait difficile mdr
    Si on pouvait m'aider un peu et me donner quelques pistes ça m'irait bien.
    En fait je développe sous linux et donc compile le tout avec g++


    Merci d'avance à tous,
    Donaldo

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Bonsoir,

    alors, je te propose quelques généralités pour commencer, puis nous irons dans les détails en fonction de tes besoins.

    Avant tout, quelques mots sur gSoap, histoire de savoir de quoi on parle.

    SOAP est un protocole de communication. Il détermine le format des trames qui vont être envoyées du client au serveur (et vice-versa) afin que chacun puisse reconstituer les données envoyées.

    gSoap est une bibliothèque c++ qui, en fait, est un compilateur: il prend un fichier (.h ou .wsdl) et créé les fichiers sources (.c et .h) qui implémentent un serveur et/ou un client.

    Il y a donc 2 façons d'utiliser gSoap:
    1/ à partir d'un en-tête c/c++ (fichier .h).
    2/ à partir d'un fichier wsdl (la norme wsdl est décrite ici)

    Les avantages du 1/ c'est que c'est plus simple:il n'est pas nécessaire de connaitre la norme wsdl, et pour un développeur c/c++ c'est plus "intuitif" d'écrire un en-tête c/c++ qu'un wsdl.

    Voici un exemple de batch qui génère un serveur à partir d'un fichier .h:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ./soapcpp2 "MonServeur.h"
    pause

    Les avantages du 2/ c'est qu'il existe des outils pour vérifier la validité du wsdl, créer un xsd correspondant, etc. le wsdl étant du xml, c'est également plus facile pour un développeur qui n'aime/connais pas le c/c++.

    Le "désavantage" (je met entre guillemets parce que c'est vraiment bénin), c'est que la génération du code se fait en 2 passes: d'abord il faut générer l'en-tête, puis le code entier.

    Voici un exemple de commande batch qui génère un serveur à partir d'un wsdl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ./wsdl2h "MonServeur.wsdl"
    pause
    ./soapcpp2 "MonServeur.h"
    pause
    Dans les deux cas, le résultat est le même: un ensemble de fichiers .h et .c qui, une fois compilés, donnent un serveur et/ou un client SOAP.

    La nature du client/serveur (stand alone ou "attaché" à un serveur existant, version, etc...) dépend des paramètres de compilation passés aux compilateurs wsdl2h et soapcpp2.

    ...
    Il est tard, je commence à voir trouble lol, je continuerai demain

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 83
    Par défaut
    Oki merci pour ce début de tuto que tu souhaitais écrire sur ta page developpez.com
    En fait je suis très intéressé par la création d'un service stand alone. Hier soir j'ai essayé de créé un client pour l'exemple webserver de gSOAP, avec la commande wsdl2h et soapcpp2 cependant quand j'essaye de compiler mon client (je ne sais pas si je l'ai bien fais) j'ai pleins d'erreur de compilation concernant soap_serve.
    Peut être que je fais des erreurs bêtes mais je m'en rends pas encore compte.

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Re.

    Alors, première chose, assures-toi d'utiliser la dernière version, celle qui est sur sourgeforge: http://sourceforge.net/project/showf...ease_id=630240

    Quelle méthode souhaites-tu utiliser? (à partir d'un .h ou à partir d'un .wsdl?)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 83
    Par défaut
    En fait j'ai lancé le webserver, et j'ai fais la commande wsdl pour convertir a partir de l'adresse du wsdl en code h puis en cpp. Il m'a généré les classes meme des classes proxy et ensuite je sais pas quoi faire, j'ai essayé de compilé et des erreurs.

  6. #6
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Là comme ça je ne peux pas te dire grand-chose de plus.
    Peux-tu me montrer le wsdl et les messages d'erreurs?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 83
    Par défaut
    webserver.wsdl :
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
     
    <?xml version="1.0" encoding="UTF-8"?>
    <definitions name="webserver"
     targetNamespace="http://www.cs.fsu.edu/~engelen/webserver.wsdl"
     xmlns:tns="http://www.cs.fsu.edu/~engelen/webserver.wsdl"
     xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
     xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:ns="urn:demowebserver"
     xmlns:f="urn:form"
     xmlns:SOAP="http://schemas.xmlsoap.org/wsdl/soap/"
     xmlns:MIME="http://schemas.xmlsoap.org/wsdl/mime/"
     xmlns:DIME="http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/"
     xmlns:WSDL="http://schemas.xmlsoap.org/wsdl/"
     xmlns="http://schemas.xmlsoap.org/wsdl/">
     
    <types>
     
     <schema targetNamespace="urn:demowebserver"
      xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
      xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:ns="urn:demowebserver"
      xmlns:f="urn:form"
      xmlns="http://www.w3.org/2001/XMLSchema"
      elementFormDefault="unqualified"
      attributeFormDefault="unqualified">
      <import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="http://schemas.xmlsoap.org/soap/encoding/"/>
     </schema>
     
     <schema targetNamespace="urn:form"
      xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
      xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:ns="urn:demowebserver"
      xmlns:f="urn:form"
      xmlns="http://www.w3.org/2001/XMLSchema"
      elementFormDefault="unqualified"
      attributeFormDefault="unqualified">
      <import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="http://schemas.xmlsoap.org/soap/encoding/"/>
     </schema>
     
    </types>
     
    <message name="addRequest">
     <part name="param-1" type="xsd:double"/>
     <part name="param-2" type="xsd:double"/>
    </message>
     
    <message name="addResponse">
     <part name="param-3" type="xsd:double"/>
    </message>
     
    <message name="subRequest">
     <part name="param-4" type="xsd:double"/>
     <part name="param-5" type="xsd:double"/>
    </message>
     
    <message name="subResponse">
     <part name="param-6" type="xsd:double"/>
    </message>
     
    <message name="mulRequest">
     <part name="param-7" type="xsd:double"/>
     <part name="param-8" type="xsd:double"/>
    </message>
     
    <message name="mulResponse">
     <part name="param-9" type="xsd:double"/>
    </message>
     
    <message name="divRequest">
     <part name="param-10" type="xsd:double"/>
     <part name="param-11" type="xsd:double"/>
    </message>
     
    <message name="divResponse">
     <part name="param-12" type="xsd:double"/>
    </message>
     
    <portType name="webserverPortType">
     <operation name="add">
      <documentation>Service definition of function ns__add</documentation>
      <input message="tns:addRequest"/>
      <output message="tns:addResponse"/>
     </operation>
     <operation name="sub">
      <documentation>Service definition of function ns__sub</documentation>
      <input message="tns:subRequest"/>
      <output message="tns:subResponse"/>
     </operation>
     <operation name="mul">
      <documentation>Service definition of function ns__mul</documentation>
      <input message="tns:mulRequest"/>
      <output message="tns:mulResponse"/>
     </operation>
     <operation name="div">
      <documentation>Service definition of function ns__div</documentation>
      <input message="tns:divRequest"/>
      <output message="tns:divResponse"/>
     </operation>
    </portType>
     
    <binding name="webserver" type="tns:webserverPortType">
     <SOAP:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
     <operation name="add">
      <SOAP:operation style="rpc" soapAction=""/>
      <input>
         <SOAP:body use="encoded" namespace="urn:demowebserver" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </input>
      <output>
         <SOAP:body use="encoded" namespace="urn:demowebserver" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </output>
     </operation>
     <operation name="sub">
      <SOAP:operation style="rpc" soapAction=""/>
      <input>
         <SOAP:body use="encoded" namespace="urn:demowebserver" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </input>
      <output>
         <SOAP:body use="encoded" namespace="urn:demowebserver" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </output>
     </operation>
     <operation name="mul">
      <SOAP:operation style="rpc" soapAction=""/>
      <input>
         <SOAP:body use="encoded" namespace="urn:demowebserver" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </input>
      <output>
         <SOAP:body use="encoded" namespace="urn:demowebserver" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </output>
     </operation>
     <operation name="div">
      <SOAP:operation style="rpc" soapAction=""/>
      <input>
         <SOAP:body use="encoded" namespace="urn:demowebserver" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </input>
      <output>
         <SOAP:body use="encoded" namespace="urn:demowebserver" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </output>
     </operation>
    </binding>
     
    <service name="webserver">
     <documentation>gSOAP 2.7.12 generated service definition</documentation>
     <port name="webserver" binding="tns:webserver">
      <SOAP:address location="http://localhost:8080"/>
     </port>
    </service>
     
    </definitions>
    Et ensuite en faisait la commande ça ma généré toutes les fichiers suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	                   soapStub.h.gch	      webserver.div.res.xml
    soapC.cpp	   soapwebserverObject.h      webserver.h
    soapClient.cpp	   soapwebserverObject.h.gch  webserver.h.gch
    soapClientLib.cpp  soapwebserverProxy.cpp     webserver.mul.req.xml
    soapH.h		   soapwebserverProxy.h       webserver.mul.res.xml
    soapH.h.gch	   soapwebserverProxy.h.gch   webserver.nsmap
    soapServer.cpp	   webserver.add.req.xml      webserver.sub.req.xml
    soapServerLib.cpp  webserver.add.res.xml      webserver.sub.res.xml
    soapStub.h	   webserver.div.req.xml
    monClient.cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include "soapwebserverProxy.h"
    #include "webserver.nsmap"
    main()
    {
       webserverProxy service;
       double result;
       if (service.add(1.0, 2.0, result) == SOAP_OK)
          std::cout << "The sum of 1.0 and 2.0 is " << result << std::endl;
       else
          service.soap_stream_fault(std::cerr);
    }
    Ensuite j'ai compilé en faisant : g++ monClient.cpp soapC.cpp soapClient.cpp soapClientLib.cpp soapH.h soapServer.cpp soapServerLib.cpp soapStub.h soapwebserverObject.h soapwebserverProxy.cpp soapwebserverProxy.h webserver.h webserver.nsmap -lgsoap++
    Bon ça se voit que je savais pas comment faire MDR

    Et j'ai eu ensuite cette errreur :
    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
     
    soapServer.cpp: In function ‘int soap_serve(soap*)’:
    soapServer.cpp:52: erreur: ‘soap_serve_request’ was not declared in this scope
    soapServer.cpp: In function ‘int soap_serve_request(soap*)’:
    soapServer.cpp:77: erreur: ‘soap_serve_ns2__add’ was not declared in this scope
    soapServer.cpp:79: erreur: ‘soap_serve_ns2__sub’ was not declared in this scope
    soapServer.cpp:81: erreur: ‘soap_serve_ns2__mul’ was not declared in this scope
    soapServer.cpp:83: erreur: ‘soap_serve_ns2__div’ was not declared in this scope
    soapServer.cpp: In function ‘int soap_serve_ns2__add(soap*)’:
    soapServer.cpp:100: erreur: no matching function for call to ‘ns2__add::ns2__add(soap*&, double&, double&, double&)’
    soapStub.h:44: note: candidats sont: ns2__add::ns2__add()
    soapStub.h:44: note:                 ns2__add::ns2__add(const ns2__add&)
    soapServer.cpp: In function ‘int soap_serve_ns2__sub(soap*)’:
    soapServer.cpp:141: erreur: no matching function for call to ‘ns2__sub::ns2__sub(soap*&, double&, double&, double&)’
    soapStub.h:65: note: candidats sont: ns2__sub::ns2__sub()
    soapStub.h:65: note:                 ns2__sub::ns2__sub(const ns2__sub&)
    soapServer.cpp: In function ‘int soap_serve_ns2__mul(soap*)’:
    soapServer.cpp:182: erreur: no matching function for call to ‘ns2__mul::ns2__mul(soap*&, double&, double&, double&)’
    soapStub.h:86: note: candidats sont: ns2__mul::ns2__mul()
    soapStub.h:86: note:                 ns2__mul::ns2__mul(const ns2__mul&)
    soapServer.cpp: In function ‘int soap_serve_ns2__div(soap*)’:
    soapServer.cpp:223: erreur: no matching function for call to ‘ns2__div::ns2__div(soap*&, double&, double&, double&)’
    soapStub.h:107: note: candidats sont: ns2__div::ns2__div()
    soapStub.h:107: note:                 ns2__div::ns2__div(const ns2__div&)
    soapServer.cpp: In function ‘int soap_serve(soap*)’:
    soapServer.cpp:52: erreur: ‘soap_serve_request’ was not declared in this scope
    soapServer.cpp: In function ‘int soap_serve_request(soap*)’:
    soapServer.cpp:77: erreur: ‘soap_serve_ns2__add’ was not declared in this scope
    soapServer.cpp:79: erreur: ‘soap_serve_ns2__sub’ was not declared in this scope
    soapServer.cpp:81: erreur: ‘soap_serve_ns2__mul’ was not declared in this scope
    soapServer.cpp:83: erreur: ‘soap_serve_ns2__div’ was not declared in this scope
    soapServer.cpp: In function ‘int soap_serve_ns2__add(soap*)’:
    soapServer.cpp:100: erreur: no matching function for call to ‘ns2__add::ns2__add(soap*&, double&, double&, double&)’
    soapStub.h:44: note: candidats sont: ns2__add::ns2__add()
    soapStub.h:44: note:                 ns2__add::ns2__add(const ns2__add&)
    soapServer.cpp: In function ‘int soap_serve_ns2__sub(soap*)’:
    soapServer.cpp:141: erreur: no matching function for call to ‘ns2__sub::ns2__sub(soap*&, double&, double&, double&)’
    soapStub.h:65: note: candidats sont: ns2__sub::ns2__sub()
    soapStub.h:65: note:                 ns2__sub::ns2__sub(const ns2__sub&)
    soapServer.cpp: In function ‘int soap_serve_ns2__mul(soap*)’:
    soapServer.cpp:182: erreur: no matching function for call to ‘ns2__mul::ns2__mul(soap*&, double&, double&, double&)’
    soapStub.h:86: note: candidats sont: ns2__mul::ns2__mul()
    soapStub.h:86: note:                 ns2__mul::ns2__mul(const ns2__mul&)
    soapServer.cpp: In function ‘int soap_serve_ns2__div(soap*)’:
    soapServer.cpp:223: erreur: no matching function for call to ‘ns2__div::ns2__div(soap*&, double&, double&, double&)’
    soapStub.h:107: note: candidats sont: ns2__div::ns2__div()
    soapStub.h:107: note:                 ns2__div::ns2__div(const ns2__div&)
    soapwebserverObject.h: In member function ‘virtual int webserverService::serve()’:
    soapwebserverObject.h:37: erreur: ‘soap_serve’ was not declared in this scope

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 83
    Par défaut
    La je cherche déjà a faire le client, mais j'ai du mal a comprendre le fonctionnement du webserver le sample fournit avec gsoap tu peux m'expliquer un peu comment il fonctionne? Comment il a mis en place le stand alone?

    Merci d'avance

  9. #9
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Aïe, tu es sous linux... je n'ai jamais utilisé gsoap sous linux, et je n'ai pas de linux sous la main là dans l'immédiat.
    Le fait qu'il soit stand alone dépend des paramètres que tu passes à l'exécutable soapcpp. Fait un soapcpp -h pour avoir la liste. Je crois me souvenir que pour le stand alone il faut utilise -S (à vérifier).

Discussions similaires

  1. Création d'un serveur en C
    Par coco21 dans le forum Réseau
    Réponses: 7
    Dernier message: 08/12/2006, 12h43
  2. Création d'un serveur Mail sous linux
    Par wassim_kh dans le forum Serveurs (Apache, IIS,...)
    Réponses: 14
    Dernier message: 03/07/2006, 18h55
  3. [Configuration] création de socket serveur
    Par sayuiki dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 28/03/2006, 15h29
  4. [D7][intraweb] accéder par le réseau au serveur standalone
    Par Magnus dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/10/2005, 12h34
  5. Création d'un Serveur Multi Client
    Par N*E*R*D dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 16/03/2004, 17h13

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