Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1394 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Programme client serveur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Programme client serveur

n°1295034
clubmed02
Posté le 30-01-2006 à 17:54:55  profilanswer
 

Bonjour,
j'ai un programme client serveur de reservation de places de spectacles à terminer, et je suis bloqué.
 
En détail :
- Dans le cas d'une consultation, les clients envoient des requêtes de consultation du nombre de places restantes pour un spectacle (nom, date), et recoivent en retour nb_dispo du serveur de consultation.
- Dans le cas d'une réservation, les clients envoient des requêtes de réservation (nom, date, nb_place) et recoivent du serveur de réservation, un acquitement si cela est possible (nb_dispo >= nb_place).
 
Les contraintes :
1. Clients et Serveurs sont sur une même machine
2. Le processus père du serveur de réservation créé un fils dont le code exécutable recouvre celui du père. C'est donc un execl qui va faire le boulot.
3. Les infos des spectacle (sorte de BDD) sont stockées dans un segment de mémoire partagée.
 
j'ai donc choisit comme moyen de communication :
-entre les clients et les serveurs : les Files de Messages; une pour la consultation (clé 17) et une pour la réservation (clé 314).
-entre le père et son fils (serveur consultation et réservation): 1 tube anonyme.
 
j'en suis au serveur de consultation, quand le fils lance l'execl. Comment récupérer le résultat ??? (càd nb_dispo)
 
Voici ce que j'ai déjà fait :
 
Les structures des messages:
 
A_Consultation :
 
Requête :
 
struct requete_cons
{
long  letype ;      /* destinataire du message */
pid_t  mon_pid ;  /* N° PID de l’expéditeur */
char   nom[512] ; /* nom du spectacle */
char  date[8];; /* date du spectacle jjmmaaaa */
} ;
 
Réponse :
 
struct reponse_cons
{
long  letype ;
int   nb_dispo ; /* nombre de places disponibles */
} ;
 
B_Réservation :
 
Requête :
 
struct requete_resa {
long letype ;        /* destinataire du message */
pid_t mon_pid ;    /* N° PID de l’expéditeur */
char  nom[512] ;   /* nom du spectacle */
char date[8];         /* date du spectacle jjmmaaaa */
int  nb_places   /* nombre de places à réserver */
} ;
 
Réponse :
 
struct reponse_resa
{
long  letype ;
short etat ;  /* résultat de la réservation */
} ;
 
Les processus CLIENTS
 
a - le processus client Consultation :
 
Main ( )
{
Int msqid ;
Msqid = msgget (17,0)
Requete_cons.letype = 1 ;
Requete_cons.mon_pid = getpid ( ) ;
Msgsnd (msqid , requete_cons , ___ ) ;
Msgrcv (msqid , reponse_cons , getpid ( )  ) :
Exit ( )
}
 
b - le processus client Réservation :
 
Main ( )
{
Int msqid ;
Msqid = msgget (314,0)
Requete_resa.letype = 2 ;
Requete_resa.mon_pid = getpid ( ) ;
Msgsnd (msqid , requete_resa , ___ ) ;
Msgrcv (msqid , reponse_resa , getpid ( )  ) :
Exit ( )
}
 
Les processus SERVEUR:
 
c- le processus serveur Consultation:
 
# include …
# define CLE 17
Main ( )
{
Int msqid ;
int tube[2] ;
Pid_t retour ;
Msqid = msgget (17, IPC_CREAT | IPC_EXCL | 0660 )
Msgrcv (msqid , requete_cons , 1 , ___ ) ;
 
Pipe (tube) ;      /* ouverture du tube */
Retour = fork ( ) ;
 
If (retour == 0)
{                   /* LE FILS */
close ( tube [1] ) ;     /* pas d’écriture sur le tube */
read ( tube [0] , ………    /* lecture sur le tube */
execl (« /home/steph/applis/consult.exe », « consult.exe », ___ ) ;
msgsnd ( msqid , nb_dispo, ____ ) ;  /* envoi résultat de consult.exe */
close ( tube [0] ) ;     /* pas de lecture sur le tube */
exit ( ) ;
 
else
{        /* LE PÈRE */
close ( tube [0] ) ;     /* pas de lecture sur le tube */
write( tube [1], requete_cons, ???)  /* écriture  requete sur le tube */
close ( tube [1] ) ;
wait ( ) ;
}

mood
Publicité
Posté le 30-01-2006 à 17:54:55  profilanswer
 

n°1295042
Sebou77
French Tech powaa :-)
Posté le 30-01-2006 à 18:00:43  profilanswer
 

Pas la peine de créer 2 topic :)
Et utilises les balises [cpp] on y verra plus clair :)

n°1295102
Sve@r
Posté le 30-01-2006 à 18:45:09  profilanswer
 

clubmed02 a écrit :

Bonjour,
j'ai un programme client serveur de reservation de places de spectacles à terminer, et je suis bloqué. J'en suis au serveur de consultation, quand le fils lance l'execl. Comment récupérer le résultat ??? (càd nb_dispo)


 
Quand un processus lance un "execl", il est automatiquement remplacé par le nouveau processus. Donc à partir de ton "execl", ton fils n'existe plus (c'est à dire que si tu écris du code après l'execl, ce code ne sera jamais exécuté).
 
Maintenant, tu te trouves avec deux programmes indépendants. Le père et le pgm lancé par l'execl. Si tu veux les faire communiquer, ben tu as le choix entre pipe, sockets, shm ou msq.


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1295108
clubmed02
Posté le 30-01-2006 à 18:50:59  profilanswer
 

tu veux pas m'en expliquer un peu plus ? Tu sais, c'est la première fois que je fais de la programmation système...

n°1295138
Emmanuel D​elahaye
C is a sharp tool
Posté le 30-01-2006 à 20:41:47  profilanswer
 

Sve@r a écrit :

Quand un processus lance un "execl", il est automatiquement remplacé par le nouveau processus. Donc à partir de ton "execl", ton fils n'existe plus (c'est à dire que si tu écris du code après l'execl, ce code ne sera jamais exécuté).
 
Maintenant, tu te trouves avec deux programmes indépendants. Le père et le pgm lancé par l'execl. Si tu veux les faire communiquer, ben tu as le choix entre pipe, sockets, shm ou msq.


C'est pas de la programmation système, c'est de l'application Unixoide...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1295200
clubmed02
Posté le 30-01-2006 à 22:28:27  profilanswer
 

Bon, ne sachant pas trop si c'est correct, je fais une hypothèse:
l'appli lancée par l'execl effectuer la réservation et renvoyer le résultat par msgsn(....), donc directement dans la file de message à destination du client. Ca peut se faire ?

n°1295229
Sve@r
Posté le 30-01-2006 à 23:09:32  profilanswer
 

clubmed02 a écrit :

Bon, ne sachant pas trop si c'est correct, je fais une hypothèse:
l'appli lancée par l'execl effectuer la réservation et renvoyer le résultat par msgsn(....), donc directement dans la file de message à destination du client. Ca peut se faire ?


Euh... je sais pas si tes primitives "msgsn" sont équivalents à celles que je connais (à savoir "msq" ). Mais si tes deux programmes ont moyen de travailler sur la même file de messages (par la même clef je pense) alors il n'y a aucun problème.
 
De toute façon il faut considérer que ton pgm lancé par "execl" et ton client sont deux programmes distincts. S'ils doivent communiquer ensemble il leur faut utiliser des outils standards de communication inter processus


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1295231
Arjuna
Aircraft Ident.: F-MBSD
Posté le 30-01-2006 à 23:13:00  profilanswer
 

Si je peux me permettre, c'est pas ce que j'appelle une appli client/serveur... C'est plutôt une appli multi-processus... Même pas multi-user apparement.

n°1295254
clubmed02
Posté le 31-01-2006 à 00:19:04  profilanswer
 

Bon les gars, on va pas s'étendre sur la philosophie du problème qu'on ma imposé. Il est clair qu'il est techniquement tordu, et pédagogiquement... mystère (j'aurai mon partiel avant que ce projet soit corrigé... fort, non ?). Ceci dit, il me faut finir. Dernière info, je ne dois pas détailler la mémoire partagée (pas vu en cours).
 
voilà ce que je propose pour mon exec, que j'ai appelé consult :
- Attachement à la mémoire partagée  
- Recherche des informations dans la mémoire partagée  
- construction de reponse_cons : pid_client, nom, date, nb_dispo
- Détachement de la mémoire partagée
- envoi du message dans la MSQ 17
 
Pour la réservation, prog resa.exe :
- Pose d'un sémaphore sur la mémoire partagée.  
- Attachement à la mémoire partagée  
- Recherche des informations dans la mémoire partagée  
- si nb_place >= nb_dispo, alors réserver_places
- nb_dispo = nb_dispo_nb_place
- construction de  reponse_resa : pid_client, etat = « OK »
- Dépose du sémaphore  
- Détachement de la mémoire partagée
- Envoi du message dans la MSQ 314
 
???

Message cité 1 fois
Message édité par clubmed02 le 31-01-2006 à 00:22:26
n°1295284
Sve@r
Posté le 31-01-2006 à 07:59:17  profilanswer
 

clubmed02 a écrit :

Dernière info, je ne dois pas détailler la mémoire partagée (pas vu en cours).


Mémoire partagée: Tu définis un pointeur de type "char *pt" puis tu fais "pt=shmat(...)". A partir de ce pointeur, tu as à ta disposition une zone de "n" octets (comme malloc) mais d'autres pgm y ont aussi accès par la même méthode => mémoire partagée. Ne pas oublier de faire "shmdt(pt)" dès que t'en as plus besoin.
http://fr.lang.free.fr/cours/IPC_Csyst_v1.0.pdf
 

clubmed02 a écrit :

voilà ce que je propose pour mon exec, que j'ai appelé consult :
- Attachement à la mémoire partagée  
- Recherche des informations dans la mémoire partagée  
- construction de reponse_cons : pid_client, nom, date, nb_dispo
- Détachement de la mémoire partagée
- envoi du message dans la MSQ 17
 
Pour la réservation, prog resa.exe :
- Pose d'un sémaphore sur la mémoire partagée.  
- Attachement à la mémoire partagée  
- Recherche des informations dans la mémoire partagée  
- si nb_place >= nb_dispo, alors réserver_places
- nb_dispo = nb_dispo_nb_place
- construction de  reponse_resa : pid_client, etat = « OK »
- Dépose du sémaphore  
- Détachement de la mémoire partagée
- Envoi du message dans la MSQ 314
 
???


 
A voir si le 1er pgm n'a pas besoin que le sémaphore soit libre...


Message édité par Sve@r le 31-01-2006 à 08:00:20

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Programme client serveur

 

Sujets relatifs
Programme client serveurProgramme qui rend invisible les links de Download en HTTP/FTP
Executer un programme externe sous WindowsServeur d'applis J2EE
Script vba pour diriger autre programme...need help ;)problème requête client vers servlet
Lancer un programme et controler celui ciCroûtage dans les règles d'un serveur : Paramétrage d'Oracle ?
[java] programme client/serveur 
Plus de sujets relatifs à : Programme client serveur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR