Cient soap en C

Cient soap en C - C - Programmation

Marsh Posté le 06-02-2006 à 17:16:16    

Bonjour à tous !
 
J'ai réalisé un webservices avec soap un peu bizarre car le serveur et le client sont en php. J'ai développé le client en php car c'était la 1ère fois que je réalisé un webservice et je voulai faire un test.
 
Je souhaiterai maintenant transformer mon client php en client C ce qui parait plus logique.
Mais voilà je ne sais pas comment m'y prendre. Je suppose qu'il faut utiliser une librairie du style gsoap. Et en plus je ne suis pas très fort en C.
 
Voilà le code de mon serveur :

Code :
  1. <?php
  2.     // INCLUS LES CLASSES SOAP
  3.     include('../lib/nusoap.php');
  4.     // CREE L'OBJET SERVEUR
  5. $serveur = new soap_server;
  6. $serveur->debug_flag=false;
  7. // ENREGISTRE LE SERVICE
  8. $serveur->register('CA');         
  9. // FONCTION DE CONTROLE D'ACCES
  10. function CA($num_site, $num_term, $num_carte)
  11. {
  12.  // CONNEXION AU SERVEUR SQL
  13.  require("connect_bdd.php" );
  14.  // SELECTION D'UNE BASE
  15.  $db_selected = mysql_select_db('ca', $link);
  16.  if (!$db_selected)
  17.  {
  18.     die('Impossible de sélectionner la base de données : ' . mysql_error());
  19.  }
  20.  // REQUETE PERMETTANT DE COMPTER LE NOMBRE D'ENTREE CORRESPONDANT A LA COMBINAISON
  21.  $requete = mysql_query("SELECT COUNT(num_carte) AS nb FROM autorisation WHERE
  22.             num_site='$num_site' AND num_term='$num_term' AND num_carte='$num_carte'" );
  23.                
  24.  if (!$requete)
  25.  {
  26.  die('Requête invalide : ' . mysql_error());
  27.  }
  28.  // RECUPERATION DU RESULTAT DE LA REQUETE
  29.  $resultat = mysql_result($requete,0);
  30.  // DEDUCTION DU DROIT D'ACCES EN FONCTION DU RESULTAT  
  31.  if ($resultat==0)
  32.  {
  33.     $droit=0;
  34.  }
  35.  else
  36.  {
  37.     $droit=1;
  38.  }
  39.  // RETOURNE LE DROIT
  40.  return "La <b>carte $num_carte</b> tente de badger sur le <b> terminal $num_term</b> du
  41.             <b>site $num_site</b>. <br><br> <b>Son droit d'accès est $droit</b>.";
  42.  // FERME LE SERVEUR
  43.  mysql_close($link);
  44. }
  45. // RETOURNE LE RESULTAT AU CLIENT SOUS FORME DE REPONSE SOAP VIA HTTP
  46. $serveur->service($HTTP_RAW_POST_DATA);
  47. ?>


 
Et maintenant mon client pour lequel je souhaiterai transformer le code PHP en code C :

Code :
  1. <?
  2.     // INCLUS LES CLASSES SOAP
  3.     include('../lib/nusoap.php');
  4. // CREE L'OBJET CLIENT
  5. $client = new soapclient('http://127.0.0.1/Webservice_soap/CA/service_CA.php');
  6.     // GESTION D'ERREUR DE CONNEXION DU CLIENT
  7.     $err = $client->getError();
  8.    
  9. if ($err)
  10. {
  11.  echo '<h2>Erreur de construction</h2><pre>' . $err . '</pre>';
  12. }
  13. else
  14. {
  15.  // ENREGISTREMENT DES PARAMETRES
  16.  $parametres = array('site'=>$_POST['num_site'],'terminal'=>$_POST['num_term'],'num_carte'=>$_POST['num_carte']);
  17.  // APPEL LA FONCTION DU SERVEUR AVEC LES PARAMETRES  
  18.  $recup = $client->call('CA', $parametres);
  19.  // AFFICHE LE RESULTAT PROVENANT DU SERVEUR
  20.  print $recup;
  21. }
  22. ?>


 
Si quelqu'un peut m'aider ou est capable de transformer ce code, ca serait sympa.
 
Merci d'avance
Olivier


Message édité par Vilo5 le 11-02-2006 à 19:22:37
Reply

Marsh Posté le 06-02-2006 à 17:16:16   

Reply

Marsh Posté le 06-02-2006 à 18:58:01    

Mauvaise cat ...

Reply

Marsh Posté le 06-02-2006 à 23:35:26    

++fab a écrit :

Mauvaise cat ...


 
A mince désolé j'aurai du posté ca ou ?
J'ai mis ce message dans le forum programmation -> C  car je cherche à transformer du code en C.

Reply

Marsh Posté le 06-02-2006 à 23:41:55    

Vilo5 a écrit :

A mince désolé j'aurai du posté ca ou ?
J'ai mis ce message dans le forum programmation -> C  car je cherche à transformer du code en C.


 
Oui, c'est bien en Cat C que je le voyais aussi ... Vous postates dans la cat C++ mon cher :)

Reply

Marsh Posté le 11-02-2006 à 19:25:55    

++fab a écrit :

Oui, c'est bien en Cat C que je le voyais aussi ... Vous postates dans la cat C++ mon cher :)


 
Très bien j'ai édité le message de manière à le déplacer dans la catégorie C.
 
Toujours rien, personne n'a une idée ?

Reply

Marsh Posté le 14-02-2006 à 17:36:46    

En utilisant la librairie gsoap tu devrais procèder comme ca je pense ( j'utilise ca depuis quelques jours seulement donc je peux me tromper ). D'abord, tu dois créer un fichier .h contenant la déclaration des méthodes du service.
Exemple pour une calculatrice :
 

Code :
  1. //gsoap ns service encoding: literal
  2. typedef double xsd__double;
  3. int ns__add(xsd__double a, xsd__double b, xsd__double *result);
  4. int ns__subtract(xsd__double a, xsd__double b, xsd__double *result);
  5. int ns__multiply(xsd__double a, xsd__double b, xsd__double *result);
  6. int ns__divide(xsd__double a, xsd__double b, xsd__double *result);


 
ensuite tu dois compiler le fichier .h avec soapcpp2, ca va te donner tout une série de fichier .h, .c,...
 
Maintenant tu codes ton client.
Exemple :

Code :
  1. #include "soapH.h"
  2. #include <iostream>
  3. #include "ns.nsmap"
  4. int main(int argc, char* args[])
  5. {
  6.  
  7.    double result ;
  8.    struct soap soap; // gSOAP runtime environment
  9.    printf("kikoulol\n" ) ;
  10.    soap_init(&soap); // initialize runtime environment (only once)
  11.    if (soap_call_ns__add(&soap, "http://localhost:80", NULL, 53.1, 7.2, &result) != SOAP_OK)
  12.       std::cout << "Add : " << 53.1 << " " << 7.2 << " = "  << result << std::endl;
  13.    else // an error occurred
  14.       soap_print_fault(&soap, stderr); // display the SOAP fault message on the stderr stream
  15.    soap_destroy(&soap); // delete deserialized class instances (for C++ only)
  16.    soap_end(&soap); // remove deserialized data and clean up
  17.    soap_done(&soap); // detach the gSOAP environment
  18.    return 0 ;
  19. }


 
Attention :  
- chez moi c'est du C++ donc remplacer les cout par des printf ( toute facon je sais pas pourquoi les cout n'affichent rien...
- Vérifie que ton client envoi bien sur le port écouté par le serveur.
- La ligne en commentaire pour le .h est a mettre également avec les //
- ne pas oublier l'include du soapH.h et du ns.nsmap
 
Voila j'espère avoir pu t'aider.

Reply

Marsh Posté le 15-02-2006 à 10:00:28    

Merci bcp, mais désolé je ne comprend pas très bien la démarche.
 
Comment cà :

Citation :

ensuite tu dois compiler le fichier .h avec soapcpp2, ca va te donner tout une série de fichier .h, .c,...

???
 
ensuite comment mon client trouve les header :

Citation :

#include "soapH.h"
#include "ns.nsmap"

???
 
merci !
 
 

Reply

Marsh Posté le 15-02-2006 à 13:29:05    

La libraire gsoap te fournit un programme ( soapcpp2 ) qui permet de produire les fichiers nécéssaires à la création et l'accès du service à partir d'un simple .h ( dans le tas il va produire le fichier soapH.h qui permettra à ton client de trouver les header )
Ensuite tu compiles ton client comme ceci :
g++ -g -ggdb -DDEBUG tonClient.cpp soapC.cpp soapClient.cpp -c -o -I /usr/local/include/
 
Le site de gsoap ici
Tu y trouveras des explications ( attention la doc n'est pas très à jour )

Reply

Marsh Posté le 15-02-2006 à 15:13:18    

Ok merci.
 
Mais j'ai déjà un problème avant d'arriver à cette étape.
 
J'ai bien télécharger le fichier gsoap_linux2.7.6d.tar.gz sous ma debian mais je n'arrive pas à l'installer.
Quel démarche fauut'il suivre pour l'installer?
 
Merci d'avance

Reply

Marsh Posté le 15-02-2006 à 20:38:37    

tar -zxvf gsoap_linux2.7.6d.tar.gz  
./configure ( plus sur si il y en a un )
make
make install

Reply

Marsh Posté le 15-02-2006 à 20:38:37   

Reply

Marsh Posté le 16-02-2006 à 08:54:52    

Ok merci, ca y est c'est fait.
 
Je vais pouvoir m'attaquer à la suite.

Reply

Marsh Posté le 16-02-2006 à 09:12:23    

au fait tu auras sans doute besoin de la description wsdl de ton service.

Reply

Marsh Posté le 16-02-2006 à 10:37:21    

Encore une chose au niveau de l'install de gsoap.
 
J'ai effectivement fait un : ./configure   et c'est tout rien d'autre
 
Pour être sure que cela a bien fonctionné, comment faire ? Ou la librairie s'est t'elle installé, quel fichier supplémentaitre dois-je trouver, ...
J'avoue avoir du mal à comprendre.

Reply

Marsh Posté le 16-02-2006 à 11:16:56    

tu dois faire aussi
make
make install
 
Si ca a fonctionné tu devrais pouvoir taper soapcpp2 dans un terminal et obtenir ca :
**  The gSOAP Stub and Skeleton Compiler for C and C++ 2.7.6d
**  Copyright (C) 2000-2005, Robert van Engelen, Genivia Inc.
**  All Rights Reserved. This product is provided "as is", without any warranty.
**  The gSOAP compiler is released under one of the following three licenses:
**  GPL, the gSOAP public license, or the commercial license by Genivia Inc

Reply

Marsh Posté le 16-02-2006 à 11:44:08    

Ok ok je l'ai fait et ca marche.
Thanks !
 
Donc maintenant j'en suis au point ou je doit créer ce fameux fichier.h tu dit je site :
 

Citation :

ensuite tu dois compiler le fichier .h avec soapcpp2, ca va te donner tout une série de fichier .h, .c,...


 
Comment je fait cà ?
Il na faut pas utiliser gcc mais soapcpp2 c'est cà? mais comment ?


Message édité par Vilo5 le 16-02-2006 à 11:44:58
Reply

Marsh Posté le 16-02-2006 à 12:08:19    

Bon c'est la que ca devient marrant ( en fait perso je fais l'inverse j'ai mon serveur en C++ et mon client en php mais ca merde bien... ).
J'ai regardé sur le site et visiblement tu dois avoir un fichier wsdl ( en gros ca décrit ton service ), à partir de lui tu peux créer tes fichiers .h etc dont tu as besoin pour le client.
 
Seulement en php je sais pas comment tu fais pour récupérer cette description du service ( regarde si t'as pas une fonction dans NUsoap qui le permet ), sinon tu peux toujours le faire à la main...
 
Regarde ici ca t'explique comment faire à partir du moment ou tu as le fichier wsdl.


Message édité par LePhasme le 16-02-2006 à 12:08:49
Reply

Marsh Posté le 16-02-2006 à 13:34:15    

Oui merci j'avais déjà cette doc sur gsoap mais j'ai du mal a m'en sortir avec.
 
En ce qui concerne Wsdl on est pas obligé de s'en servir.
 
J'ai déjà fait mon serveur php (voir mon 1er message) avec nusoap et j'ai pas eu besoin de wsdl.
 
Tout ce  dont j'ai besoin maintenant c'est de récupérer une structure d'un client en C utilisant gsoap sans wsdl.
 
En gros il me faut trouver une équivalence en C au 4 ligne suivante du client que j'ai fait en php (voir mon 1er message) . Donc quelque chose qui remplacerai ca :

Code :
  1. // INCLUS LES CLASSES SOAP
  2. include('../lib/nusoap.php'); 
  3. // CREE L'OBJET CLIENT
  4. $client = new soapclient('http://127.0.0.1/Webservice_soap/CA/service_CA.php');
  5. // ENREGISTREMENT DES PARAMETRES
  6. $parametres = array('site'=>$_GET['num_site'],'terminal'=>$_GET['num_term'],'num_carte'=>$_GET['num_carte']);
  7. // APPEL LA FONCTION DU SERVEUR AVEC LES PARAMETRES ET RECUPERE LA REPONSE
  8. $recup = $client->call('CA', $parametres);


Message édité par Vilo5 le 16-02-2006 à 13:35:37
Reply

Marsh Posté le 16-02-2006 à 14:01:08    

Tu peux toujours essayer de faire un prototype de ta fonction en C et te baser la dessus pour la creation du client mais j'ai des doutes sur le bon fonctionnement de cette technique...

Reply

Marsh Posté le 16-02-2006 à 14:18:44    

Non en fait il faut que je trouve dans gsoap l'équivalent de "new soapclient" et de la fonction "call" que j'utilise avec avec nusoap.
 
Mais je ne trouve pas et je ne sais pas quelle header il faut que j'utilise.

Reply

Marsh Posté le 16-02-2006 à 15:07:41    

Ceci initialise un client soap : soap_init(&soap);
L'appel a la fonction : soap_call_ns__add(&soap, "http://localhost:80", NULL, 53.1, 7.2, &result)
 
C'est pas vraiment la même façon de penser qu'en php, en fait ici l'appel à ta méthode call ce sera un appel normal en C.

Reply

Marsh Posté le 16-02-2006 à 15:20:39    

Ok merci.
 
Et je met quoi comme header en haut de mon fichier ?

Reply

Marsh Posté le 16-02-2006 à 15:38:02    

Au moin ca :
 
#include "soapH.h"
#include "ns.nsmap"

Reply

Marsh Posté le 17-02-2006 à 09:00:50    

Petite question, pourquoi tu développes pas ton serveur et ton client en C++, pourquoi un mélange des 2 ?

Reply

Marsh Posté le 17-02-2006 à 11:00:03    

je ne maitrise pas du tout le C++.
Je veu donc faire un client C.
 
En ce qui concerne le serveur, je le fait en PHP car on me la demandé (mon chef) mais également car j'utilise easy php qui me permet de dialoguer facilement avec ma base de donnée. De plus le serveur lui au moins fonctionne déjà, il serait bête pour moi de le refaire dans un autre language qui de plus je maîtrise moins bien.

Reply

Marsh Posté le 17-02-2006 à 11:14:09    

ok, mais bon c'est pas évident la communication entre les 2 pour réussir à envoyer des messages du client en php et recevoir la réponse du serveur en  C++ il nous a fallu toute la journée avec mon collègue... ( c'est surtout le client qui nous a posé problème vu que c'est lui qui devait s'adapter au serveur... ).
En cas de problème demande toujours ;-)

Reply

Marsh Posté le 17-02-2006 à 14:03:45    

Si cela ne te dérange pas bien sure, serait t'il possible de récupérer les sources de ton client et serveur pour m'en inspirer (en message privé si tu préfère). Même si dans ton cas les languages du client et du serveur sont inversés par rapport à moi. Ca pourra certainement m'aider tout de même.


Message édité par Vilo5 le 17-02-2006 à 14:04:25
Reply

Marsh Posté le 17-02-2006 à 22:57:13    

Je t'envoies ca dès que possible ( ici on avait fait des modifs et tout merdait... ), on va modifier certains truc pour que ce soit plus compatible parce que la on a fait du bricolage...

Reply

Marsh Posté le 18-02-2006 à 01:36:44    

OK je comprend.
 
Merci en tout cas, c'est sympa.
Car là j'avoue avoir du mal sous linux avec la librairie gsoap.
 
Il faut savoir que je débute dans le débvelopement sous linux et qu'en C je ne suis pas un pro, on va dire que j'ai quelque base apprises à l'école. C'est également presque la 1ère que j'utilise les webservices et développe un client serveur (sauf un exemple très simpliste en VB mais ca n'a rien à voir)

Reply

Marsh Posté le 18-02-2006 à 11:54:21    

C'est à peu près pareil pour moi, je n'ai jamais réellement développé sous linux, et je connais gsoap depuis une semaine... mais heureusement mon maitre de stage était la pour m'expliquer.
Et les webservice j'ai découvert ca au début de mon stage...

Reply

Marsh Posté le 19-02-2006 à 10:20:41    

Disons que moi mon tuteur, pas par mauvause volonté, ne peut pas tallement m'aider car il n'est pas non plus vraiment compétant dans le domaine donc ce n'est pas évident. Développement sous linux il ne connait pas trop et les webservices non plus. De plus il attend une autonomie de ma part.  :pt1cable:

Reply

Marsh Posté le 21-02-2006 à 09:41:52    

up
 
J'ai fait une petite pose pendant quelques jour dans mon sujet, pour me consacrer a d'autres tests.
 
J'ai testé sur mon système embarqué un client-serveur en C utilisant les sockets, que j'ai trouvé sur le net déjà tout fait. J'ai du recompiler le client avec un compilateur croisé afin qu'il fonctionne sur mon module embarqué, le Digi ConnectMe voir "ici" (il utilise une platform à base de processeur arm et non x86).
 
Résultat ça marche j'arive à compiler pour arm et a discuter via mon serveur web embarqué et donc avec le client serveur tout fait que j'ai recup.
 
C'est déjà une bonne étape dans mon projet j'arrive à utiliser le serveur web du module embarqué, j'arrive à recompiler le noyau linux et le recharger dans le module et j'arrive à y ajouter de nouvelle application compilé au bon format (pour arm).
 
Maintenant que je sais que cela fonctionne, je peut me consacrer pleinement a mon projet et essayer de faire programme principal en retourner voir du côté de mon client gsoap.
 
Et toi tu a avancé ?
pourrait tu à la rigueur me montrer ton client serveur même si il n'est pas encore entièrement terminé. J'éspère que cela pourra me faire avancé.


Message édité par Vilo5 le 21-02-2006 à 09:58:26
Reply

Marsh Posté le 21-02-2006 à 10:48:51    

Le fichier .h ( contenant les prototypes des fonctions )

Code :
  1. //gsoap cb service encoding: literal
  2. //gsoap cb service name: combus
  3. //gsoap cb service definitions: combus
  4. //gsoap cb service location: http://172.16.100.42:9010 // remplace ca par l'ip du serveur
  5. //gsoap cb service namespace: urn:combus
  6. //gsoap cb schema elementForm: qualified   // ne pas oublier les 2 dernières lignes sinon il y a des problèmes de namespace ( du moin dans notre cas )
  7. //gsoap cb schema attributeForm: qualified
  8. typedef int xsd__int;
  9. typedef double xsd__double;
  10. typedef std::string xsd__string;
  11. int cb__add( xsd__int firstNumber, xsd__int secondNumber, xsd__int * result) ;
  12. int cb__multiply( xsd__int firstNumber, xsd__int secondNumber, xsd__int * result) ;


 
Le fichier .cpp ( ou .c ) du serveur :
 

Code :
  1. #include <iostream>
  2. #include "soapH.h"
  3. #include "combus.nsmap"
  4. #include <string>
  5. using namespace std ;
  6. int main()
  7. {
  8. struct soap soap ;
  9. int m, s; // master and slave sockets
  10. string a = "" ;
  11. soap_init(&soap);
  12. soap.bind_flags=SO_REUSEADDR;
  13. m = soap_bind(&soap, "172.16.100.42", 9010, 100);
  14. if (m < 0)
  15.   soap_print_fault(&soap, stderr);
  16. else
  17. {
  18.   fprintf(stderr, "Socket connection successful: master socket = %d\n", m);
  19.   for (int i = 1; ; i++)
  20.   {
  21.    s = soap_accept(&soap);
  22.    if (s < 0)
  23.    { 
  24.     fprintf(stderr,"ERREUR\n" ) ;
  25.     soap_print_fault(&soap, stderr);
  26.     break;
  27.    }
  28.    //fprintf(stderr, "%d: accepted connection from IP=%d.%d.%d.%d socket=%d\n", i,  instruction commentée parce que je voulais testée les perfs du
  29.    //(soap.ip >> 24)&0xFF, (soap.ip >> 16)&0xFF, (soap.ip >> 8)&0xFF, soap.ip&0xFF, s); serveur, tu peux les remettre si tu veux.
  30.    if (soap_serve(&soap) != SOAP_OK) // process RPC request
  31.     soap_print_fault(&soap, stderr); // print error
  32.   else
  33.     fprintf(stderr, "request served\n" );
  34.    soap_destroy(&soap); // clean up class instances
  35.    soap_end(&soap); // clean up everything and close socket
  36.   }
  37. }
  38. soap_done(&soap); // close master socket and detach environment
  39. std::cout << "Go Go Go!" << std::endl ;
  40. return 0 ;
  41. }
  42. int cb__add(struct soap *soap, int firstNumber, int secondNumber, int * result)
  43. {
  44.    *result = firstNumber + secondNumber ;
  45.    return SOAP_OK;
  46. }
  47. int cb__multiply(struct soap *soap, int firstNumber, int secondNumber, int * result)
  48. {
  49.    *result = firstNumber * secondNumber ;
  50.    return SOAP_OK;
  51. }


 
Le fichier .cpp du client :
 

Code :
  1. #include "soapH.h"
  2. //#include "soapProxy.h"
  3. #include <iostream>
  4. #include <string>
  5. #include "combus.nsmap"
  6. using namespace std ;
  7. int main(int argc, char* args[])
  8. {
  9.    unsigned long int i, j ;
  10.    int result ;
  11.    double nbsec, nbsecdiff ;
  12.    string * tab = NULL ;
  13.    double min = 99999 , max =  0, moy = 0 ;
  14.    for ( int j = 0 ; j < 10 ; j++ ) {
  15.    nbsec = time(NULL) ;
  16.    for (  i = 0 ; i < 40000 ; i++ ) {
  17.    struct soap soap; // gSOAP runtime environment
  18.    soap_init(&soap); // initialize runtime environment (only once)
  19.    soap_call_cb__add(&soap, "http://172.16.100.42:9010", NULL, 5,2 , &result) ;
  20.    //else // an error occurred
  21.    //   soap_print_fault(&soap, stderr); // display the SOAP fault message on the stderr stream
  22.    soap_destroy(&soap); // delete deserialized class instances (for C++ only)
  23.    soap_end(&soap);  // remove deserialized data and clean up
  24.    soap_done(&soap); // detach the gSOAP environment
  25.    }
  26.    nbsecdiff = time(NULL) - nbsec ;
  27.    if ( nbsecdiff < min ) min = nbsecdiff ;
  28.    if ( nbsecdiff > max ) max = nbsecdiff ;
  29.    moy += nbsecdiff ;
  30.   }
  31.    moy = moy / 10 ;
  32.    printf("Resultat : Min %f Max %f Moy %f\n",min,max,moy) ;
  33.    return 0 ;
  34. }


 
Voila tu as le tout, quelques remarques :
 
J'ai retouché mes fichiers, a la base c'est pas du tout des fonctions add et multiply, seulement je doute que ca plaise beaucoup que j'envoies mes sources ici donc j'ai du modifier certains truc, c'est possible que tu aies des erreurs en compilations si oui n'hésites pas à me demander.
Le tout est prévu pour des benchs je voulais voir à combien de messages/secondes tournait le serveur ( sans faire d'optimisations ), tu peux supprimer pas mal de truc dans le client ( tout ce qui est calcul du temps ).
Tu dois donc appliquer soapcpp2 sur le fichier .h, puis compiler le serveur et le client, tu lance le serveur puis le client et c'est parti... ( attention le client va envoyer 400.000 messages ca prend du temps  :whistle:
N'oublie pas de changer ton adresse IP dans le .h et vire le 2eme groupe de // que j'ai mis sur cette ligne d'ailleurs, je doute que soapcpp2 apprécie...
En cas de besoin comme d'hab...  :hello:


Message édité par LePhasme le 21-02-2006 à 10:50:21
Reply

Marsh Posté le 21-02-2006 à 12:00:41    

Ok merci super sympa, là je vais manger et je regarde ca cette après-midi si on m'en laisse le temps.
 
Merci encore

Reply

Marsh Posté le 21-02-2006 à 14:12:13    

Bon je vais tester ca mais avant tout quelque questions ?
 
C'est quoi les "cb" que tu utilise a plusieurs reprise. Dans le .h : gsoap cb ...  ,  dans leclient soap_cb_call__add . C'est le nom de ton webservice ?
 
moi mon web service fera un contrôle d'accès je l'apelle donc CA pour controle d'accès. Je peut mettre CA partout à la place de cb ?
 
 
C'est pour quoi le #include "combus.nsmap", et les appel que tu y fait dans le .h (//gsoap cb service name: combus par exemple) ?
 
Et enfin je reviens encore la dessus, désolé, mais comment je fé ca :

Citation :

Tu dois donc appliquer soapcpp2 sur le fichier .h


et pour ca :

Citation :

puis compiler le serveur et le client


je fait une compilation normal avec gcc, comme pour n'importe quel ficher source C.
 

Reply

Marsh Posté le 21-02-2006 à 14:43:35    

le cb c'est le préfixe du namespace, ce que tu mets avant le nom de la fonction pour qu'il puisse détecter de quelle namespace elle fait partie ( n'oublie pas les 2 _ ).
Le combus c'est le nom de mon service.
Le fichier combus.nsmap c'est la map du namespace, j'avoue que je comprends pas très bien son fonctionnement mais cet include est nécéssaire pour la compilation.
Et pour la compilation : ici
 
Edit : pour le soapcpp2, tu copies/colles le contenu de mon fichier .h dans un fichier .h a toi, test.h par exemple, tu tapes la commande :
soapcpp2 test.h
et ca va te donner quelque chose comme ca :  
 

Code :
  1. Saving soapStub.h
  2. Saving soapH.h
  3. Saving soapC.cpp
  4. Saving soapClient.cpp
  5. Saving soapClientLib.cpp
  6. Saving soapServer.cpp
  7. Saving soapServerLib.cpp
  8. Using cb service name: combus
  9. Using cb service style: document
  10. Using cb service encoding: literal
  11. Using cb service location: http://172.16.100.42:9010
  12. Using cb schema namespace: urn:combus
  13. Saving combus.wsdl Web Service description
  14. Saving soapcombusProxy.h client proxy
  15. Saving soapcombusObject.h server object
  16. Saving combus.sendRequest.req.xml sample SOAP/XML request
  17. Saving combus.sendRequest.res.xml sample SOAP/XML response
  18. Saving combus.sendStream.req.xml sample SOAP/XML request
  19. Saving combus.sendStream.res.xml sample SOAP/XML response
  20. Saving combus.dbRequest.req.xml sample SOAP/XML request
  21. Saving combus.dbRequest.res.xml sample SOAP/XML response
  22. Saving combus.loadModule.req.xml sample SOAP/XML request
  23. Saving combus.loadModule.res.xml sample SOAP/XML response
  24. Saving combus.unLoadModule.req.xml sample SOAP/XML request
  25. Saving combus.unLoadModule.res.xml sample SOAP/XML response
  26. Saving combus.nsmap namespace mapping table
  27. Saving cb.xsd XML schema
  28. Compilation successful


 
Il doit y avoir le compilation successful sinon c'est pas la peine d'essayer de continuer.
 


Message édité par LePhasme le 21-02-2006 à 15:24:08
Reply

Marsh Posté le 21-02-2006 à 15:41:22    

Ok je comprend maintenant mieux la méthode à utiliser, je m'y met je test ton exemple.

Reply

Marsh Posté le 21-02-2006 à 16:22:30    

Bon alors pour la compilation du .h ca va tous se passe bien :

Code :
  1. soapcpp2 soapH.h
  2. **  The gSOAP Stub and Skeleton Compiler for C and C++ 2.7.0d
  3. **  Copyright (C) 2001-2004 Robert van Engelen, Genivia, Inc.
  4. **  All Rights Reserved. This product is provided "as is", without any warranty.
  5. Saving soapH.h
  6. Saving soapC.cpp
  7. Saving soapClient.cpp
  8. Saving soapServer.cpp
  9. Saving soapClientLib.cpp
  10. Saving soapServerLib.cpp
  11. Using cb service name: combus
  12. Using cb service style: document
  13. Using cb service encoding: literal
  14. Using cb service location: http://172.16.100.42:9010
  15. Using cb schema namespace: urn:combus
  16. Saving combus.wsdl Web Service description
  17. Saving soapcombusProxy.h client proxy
  18. Saving soapcombusObject.h server object
  19. Saving combus.add.req.xml sample SOAP/XML request
  20. Saving combus.add.res.xml sample SOAP/XML response
  21. Saving combus.multiply.req.xml sample SOAP/XML request
  22. Saving combus.multiply.res.xml sample SOAP/XML response
  23. Saving combus.nsmap namespace mapping table
  24. Saving cb.xsd XML schema
  25. Compilation successful (1 warning)

enfin y a tout de même un warning.
 
Par contre rien ne va plus quand j'essaye de compiler tes fichiers client et serveur :

Code :
  1. soapcpp2 client.cpp
  2. **  The gSOAP Stub and Skeleton Compiler for C and C++ 2.7.0d
  3. **  Copyright (C) 2001-2004 Robert van Engelen, Genivia, Inc.
  4. **  All Rights Reserved. This product is provided "as is", without any warranty.
  5. client.cpp(7): syntax error
  6. client.cpp(6): Syntax error: input before ; skipped
  7. client.cpp(10): syntax error
  8. client.cpp(10): Syntax error: input before ; skipped
  9. client.cpp(14): syntax error
  10. client.cpp(13): Syntax error: input before ; skipped
  11. client.cpp(16): syntax error
  12. client.cpp(15): Syntax error: input before ; skipped
  13. client.cpp(16): syntax error
  14. client.cpp(15): Syntax error: input before ; skipped
  15. client.cpp(16): **ERROR**: Duplicate declaration of j (line 16)
  16. client.cpp(16): syntax error
  17. client.cpp(17): Syntax error: input before ; skipped
  18. client.cpp(19): syntax error
  19. client.cpp(18): Syntax error: input before ; skipped
  20. client.cpp(19): syntax error
  21. client.cpp(18): Syntax error: input before ; skipped
  22. client.cpp(19): **ERROR**: Duplicate declaration of i (line 19)
  23. client.cpp(19): syntax error
  24. client.cpp(20): Syntax error: input before ; skipped
  25. client.cpp(22): syntax error
  26. client.cpp(21): Syntax error: input before ; skipped
  27. client.cpp(23): syntax error
  28. client.cpp(22): Syntax error: input before ; skipped
  29. Critical error: too many syntactic errors, bailing out


Reply

Marsh Posté le 21-02-2006 à 16:29:29    

Le soapcpp2 c'est uniquement pour le fichier .h !
Après ca tu dois "simplement" compiler le tout avec g++.


Message édité par LePhasme le 21-02-2006 à 16:35:29
Reply

Marsh Posté le 21-02-2006 à 16:37:12    

C'est ce que je pensai mais avec gcc j'avaii plein d'erreur sur les fonctions soap alors j'ai essayé avec soapcpp2.
 
avec gcc ca me fait ca :

Code :
  1. gcc client.cpp
  2. /tmp/cca9FUaQ.o(.text+0x72): In function `main':
  3. : undefined reference to `soap_init'
  4. /tmp/cca9FUaQ.o(.text+0xa7): In function `main':
  5. : undefined reference to `soap_call_cb__add(soap*, char const*, char const*, int, int, int*)'
  6. /tmp/cca9FUaQ.o(.text+0xbd): In function `main':
  7. : undefined reference to `soap_delete'
  8. /tmp/cca9FUaQ.o(.text+0xcb): In function `main':
  9. : undefined reference to `soap_end'
  10. /tmp/cca9FUaQ.o(.text+0xd9): In function `main':
  11. : undefined reference to `soap_done'
  12. /tmp/cca9FUaQ.o(.text+0x193): In function `__static_initialization_and_destruction_0(int, int)':
  13. : undefined reference to `std::ios_base::Init::Init[in-charge]()'
  14. /tmp/cca9FUaQ.o(.text+0x1c4): In function `__tcf_0':
  15. : undefined reference to `std::ios_base::Init::~Init [in-charge]()'
  16. /tmp/cca9FUaQ.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
  17. collect2: ld a retourné 1 code d'état d'exécution


 
Voilà, je ne comprend pas j'ai pourtant bien installé gsoap.
 
edit :
 
avec g++ :

Code :
  1. g++ client.cpp
  2. /tmp/ccyqlV9g.o(.text+0x72): In function `main':
  3. : undefined reference to `soap_init'
  4. /tmp/ccyqlV9g.o(.text+0xa7): In function `main':
  5. : undefined reference to `soap_call_cb__add(soap*, char const*, char const*, int, int, int*)'
  6. /tmp/ccyqlV9g.o(.text+0xbd): In function `main':
  7. : undefined reference to `soap_delete'
  8. /tmp/ccyqlV9g.o(.text+0xcb): In function `main':
  9. : undefined reference to `soap_end'
  10. /tmp/ccyqlV9g.o(.text+0xd9): In function `main':
  11. : undefined reference to `soap_done'
  12. collect2: ld a retourné 1 code d'état d'exécution


Message édité par Vilo5 le 21-02-2006 à 16:42:33
Reply

Marsh Posté le 21-02-2006 à 16:44:33    

toi t'as pas été voir le lien que je t'ai donné pour la compilation :p

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed