Cient soap en C - C - Programmation
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.
Marsh Posté le 06-02-2006 à 23:41:55
Vilo5 a écrit : A mince désolé j'aurai du posté ca ou ? |
Oui, c'est bien en Cat C que je le voyais aussi ... Vous postates dans la cat C++ mon cher
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 ?
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 :
|
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 :
|
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.
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" |
???
merci !
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 )
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
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
Marsh Posté le 16-02-2006 à 08:54:52
Ok merci, ca y est c'est fait.
Je vais pouvoir m'attaquer à la suite.
Marsh Posté le 16-02-2006 à 09:12:23
au fait tu auras sans doute besoin de la description wsdl de ton service.
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.
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
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 ?
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.
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 :
|
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...
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.
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.
Marsh Posté le 16-02-2006 à 15:20:39
Ok merci.
Et je met quoi comme header en haut de mon fichier ?
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 ?
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.
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 ;-)
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.
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...
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)
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...
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.
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é.
Marsh Posté le 21-02-2006 à 10:48:51
Le fichier .h ( contenant les prototypes des fonctions )
Code :
|
Le fichier .cpp ( ou .c ) du serveur :
Code :
|
Le fichier .cpp du client :
Code :
|
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
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...
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
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.
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 :
|
Il doit y avoir le compilation successful sinon c'est pas la peine d'essayer de continuer.
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.
Marsh Posté le 21-02-2006 à 16:22:30
Bon alors pour la compilation du .h ca va tous se passe bien :
Code :
|
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 :
|
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++.
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 :
|
Voilà, je ne comprend pas j'ai pourtant bien installé gsoap.
edit :
avec g++ :
Code :
|
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
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 :
Et maintenant mon client pour lequel je souhaiterai transformer le code PHP en code C :
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