A voir également:
- Développement client/serveur
- Cybera client - Télécharger - Divers Réseau & Wi-Fi
- Changer serveur dns - Guide
- Filezilla client - Télécharger - Téléchargement & Transfert
- Formate pour taxer client 500€ - Forum PDF
- Numéro service client orange - Guide
5 réponses
Bonjour,
Oui en effet on peut t'aider, seulement il va falloir que tu nous en dises un peu plus sur tes problèmes, voire même les bouts de code qui posent problème.
Si tu détail un max tes soucis avec les erreurs rencontrés ça doit pouvoir se faire :)
Oui en effet on peut t'aider, seulement il va falloir que tu nous en dises un peu plus sur tes problèmes, voire même les bouts de code qui posent problème.
Si tu détail un max tes soucis avec les erreurs rencontrés ça doit pouvoir se faire :)
merci pour la réponse.
je crois que j'arrive à la fin, je vien d'ecrire tt les codes mais comme d'habitude j'ai qq fautes
alors je explique ce que je dois faire:
1: une appilcation client qui demande le nombre des places libres de tel évenement pour tel date.
2: une application serveur de consultation qui consulte le nombre des places libres et renvoit au client demandeur la réponse
3:une application serveur de reservation qui réserve des places libres par une processus fils(fork() ).
4:les événements sont enregistrés dans la mémoire central.
voici le processus création du segment de mémoire avec la création des événements:
pour le processus client:
pour lui j'ai cette erreur aprés la compilation:
processus serveur de réservation:
pour lui j'ai ces erreurs:
le dernier c'est le serveur de consultation:
avec l'erreur suivante:
j'éspere trouver ici comme d'habitude l'aide dont j'ai besoin, et pouvoir corriger mes erreurs.
merci d'avance
je crois que j'arrive à la fin, je vien d'ecrire tt les codes mais comme d'habitude j'ai qq fautes
alors je explique ce que je dois faire:
1: une appilcation client qui demande le nombre des places libres de tel évenement pour tel date.
2: une application serveur de consultation qui consulte le nombre des places libres et renvoit au client demandeur la réponse
3:une application serveur de reservation qui réserve des places libres par une processus fils(fork() ).
4:les événements sont enregistrés dans la mémoire central.
voici le processus création du segment de mémoire avec la création des événements:
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <unistd.h>
#include <stdlib.h>
/*definition des clés */
#define CLE ((key_t)100) /* cle du segment de mémoire */
#define CLES 500 /*clé du tableau de sémaphores */
/*definition des données */
typedef struct
{
char const *id;
char const *date;
unsigned nbr_place;
unsigned place_max;
}
evenement;
static evenement data[6] =
{
{"matrix1", "11/12/01", 15, 100},{"matrix2", "12/12/01", 15, 100},{"matrix3", "13/12/01", 15, 100},{"matrix4", "14/12/01", 15, 100},{"matrix5", "15/12/01", 1, 100},{"matrix6", "16/12/01", 0, 100}
};
int main (void)
{
int ret = 0;
/* création du segment de memoire partagee avec le cle */
int shmid = shmget (CLE, 1000, 0750 | IPC_CREAT | IPC_EXCL);
if (shmid == -1)
{
puts (" Erreur de creation : shmget");
ret = EXIT_FAILURE;
}
else
{
/* attachement a une reference memoire */
evenement *mem = shmat (shmid, NULL, 0);
puts (" Principal : segment memoire cree");
/* creation et initialisation des deux semaphore MUTEX et ACCES */
int semid = semget (CLES, 2, IPC_CREAT | IPC_EXCL | 0600);
if (semid == -1)
{
puts (" Erreur creation des semaphores");
ret = EXIT_FAILURE;
}
else
{
semctl (semid, 0, SETVAL, 1);
semctl (semid, 1, SETVAL, 1);
mem = data;
int car = getchar (); //pour que la memoire ne se detruise pas tt de suite
shmdt (mem);
puts (" Principal : segment memoire detruit");
}
}
return ret;
}
pour le processus client:
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* macros ============================================================== */
#define err 500000 /*ca revoit 500000 en cas d'evenement introuvable */
#define PORTC 5000
#define PORTS1 5100
#define PORTS2 5200
typedef struct {char *id; char *date;}demande;
main(void)
{
int sock;
struct sockaddr_in sockin;
char type[3];
socklen_t lg;
int n;
demande evenement;
printf("entrer le identité de l'événement : \n EX:spiderman3.\n");
fgets(evenement.id,sizeof(evenement.id),stdin);
printf("entrer la date de l'evenement (ex:12/12/09): \n");
fgets(evenement.date,sizeof(evenement.id),stdin);
printf("que vouller vous faire :\n tapper 'R' pour reservation, ou tapper 'C' pour consultation.\n");
fgets(type,sizeof type,stdin);
/*consultation*/
switch(type[0])
{
case'C':
case'c':
{
unsigned placelibre;
struct hostent *h;
/*creation de socket*/
if((sock =
socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))<0)
{
perror("erreur de creation socket");
exit(1);
}
if(!(h=gethostbyname("localhost"))) {
perror("erreur gethostbyname");
exit(3);
}
bzero(&sockin, sizeof(sockin));
sockin.sin_family = AF_INET;
memcpy(&sockin.sin_addr,h->h_addr,h->h_length);
sockin.sin_port= htons(PORTS1);
//placelibre[n]=0;
sendto(sock,(struct EVENEMENT *)&evenement,sizeof(evenement),0,(struct sockaddr *)&sockin,sizeof(sockin));
n=recvfrom(sock,placelibre,sizeof(placelibre)-1,0,(struct sockaddr *)&sockin, &lg);
if(placelibre=err)
printf("desolé, cette evenement n'existe pas \n");
else {
printf("message recu est:\n%s\n",placelibre);
};
close(sock);
}
break;
/*reservation*/
case'R':
case'r':
{
struct hostent *h;
char reponse_du_serveur[100];
/*creation de socket*/
if((sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))<0)
{
perror("erreur de creation socket");
exit(1);
};
if(!(h=gethostbyname("localhost"))) {
perror("erreur gethostbyname");
exit(3);
}
bzero(&sockin, sizeof(sockin));
sockin.sin_family = AF_INET;
memcpy(&sockin.sin_addr,h->h_addr,h->h_length);
sockin.sin_port= htons(PORTS2);
sendto (sock,(struct EVENEMENT *)&evenement,50,0,(struct sockaddr *)&sockin, sizeof(sockin));
bzero(&reponse_du_serveur,sizeof(reponse_du_serveur));
n=recvfrom(sock,reponse_du_serveur,100,0,(struct sockaddr *)&sockin, &lg);
if(strncmp(reponse_du_serveur,"erreur !!",n-1)==0)
printf("desolé, cette événement n'éxiste pas \n");
else
{
if(strncmp(reponse_du_serveur,"résérvation accépté",n-1)==0)
printf("%s\n",reponse_du_serveur);
else
printf("reponse du serveur non reconnue\n");
}
close(sock);
}
break;
default: printf("erreur de frappe, reessayer!! \n");
}
}
pour lui j'ai cette erreur aprés la compilation:
In function 'main': client.c:65: warning: passing argument 2 of 'recvfrom' makes pointer from integer without a cast
processus serveur de réservation:
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stddef.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/ipc.h>
/* macros ============================================================== */
#define MAX 500
#define PORTS 5200
#define CLE 100 /* cle du segment de mémoire */
#define CLES 500 /*clé du tableau de sémaphores*/
int retour,sock;
char *reponse="message recu du serveur de reservation\n";
typedef struct{char const *id;char const *date;unsigned voulu;}demande;
typedef struct{char const *id;char const *date;unsigned nbr_place; unsigned place_max;} evenement;
int Max(int a,int b){if(a>b) return(a); else return(b);}
char reservation(demande val)
{
int shmid, semid;
char *mem;
static evenement data[6];
struct sembuf reservation;
char *accuse="erreur !!";
/* récupération du segment de mémoire partagé avec la clé CLE*/
shmid=shmget(CLE,1000,0);
/*attachement du segment de memoire*/
mem=shmat(shmid,NULL,0);
/*recupération du tableau de sémaphores*/
semid=semget((key_t)CLES,2,0);
/* opération P(acces) */
reservation.sem_num=0;
reservation.sem_op=-1;
reservation.sem_flg=0;
semop(semid,&reservation,1);
/*lecture de la mémoire */
data=mem;
/*traitement de reservation*/
static int i;
for(i=0;i<6;i++){
/*comparaitre les ID des événemenets*/
if(strncmp((char *)val.id,(char *)data[i].id,Max(sizeof(val.id),sizeof(data[i].id))))
{
/*comparaitre les dates des événemenets*/
if(strncmp((char *)val.date,(char *)data[i].date,Max(sizeof(val.id),sizeof(data[i].id))))
{
printf("je l'ai trouvé: il y a %c place libre \n", data[i].nbr_place);
unsigned temp;
temp=(int *)data[i].nbr_place-(int*)val.voulu;
if(temp<0)
accuse="erreur: pas assez de place libre";
else {
data[i].nbr_place=temp;
accuse="résérvation accépté";
}
}
};
/*fin de traitement de reservation*/
/* opération v(acces)*/
reservation.sem_num=0;
reservation.sem_op=1;
reservation.sem_flg=0;
semop(semid,&reservation,1);
}
return (*accuse);
}
int main(void)
{
struct sockaddr_in addr_serveur;
sock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(sock==-1){
perror("erreur de creation socket");
exit(1);
};
/* mise a zero de la mémoire d'adresse. */
bzero(&addr_serveur, sizeof(addr_serveur));
/* preparation de la structure adresse*/
addr_serveur.sin_family=AF_INET;
addr_serveur.sin_port =htons(PORTS);
addr_serveur.sin_addr.s_addr=INADDR_ANY; /*b n'import quelle adresse*/
if( bind(sock,(struct sockaddr *)&addr_serveur, sizeof(addr_serveur))<0)
{ perror("Erreur d'attachement: appel BIND");
exit (2);
};
for(;;)
{ demande evenement;
struct sockaddr_in addr_client = { 0 };
int n;
char message[100];
bzero(evenement,sizeof(demande));
printf("en attente de reception ...\n");
int lg=sizeof(addr_client);
if(n=recvfrom(sock,(struct EVENEMENT*)&evenement,sizeof(evenement)-1,0,(struct sockaddr *)&addr_client,&lg)>0){
printf("le nombre d'octets recus: %i\nl'evenement demandé est: %s \nladate de l'évenement est le %s\n",n);
/*creation de tube*/
int comm1[2];
pid_t fils;
if ( pipe(comm1) == -1 ){
perror(" Erreur creation du pipe ");
return 1;;
}
/*creation de fork*/
int ret=fork();
if(ret<0) puts("erreure fork()\n");
if(ret=0){
/* le fils produit des données */
message=reservation(evenement);
close(comm1[0]);
write(comm1[1],reservation,sizeof(message));
close(comm1[1]);
wait();
}
if(ret>0){
int nb_lu;
close(comm1[1]);
nb_lu = read(comm1[0],message,sizeof(message));
close(comm1[0]);
exit(0);
}
sendto(sock, message,sizeof(message),0,(struct sockaddr *)&addr_client,lg);
}
else printf("erreur du recois du socket\n");
}
close(sock);
}
pour lui j'ai ces erreurs:
serveur_reservation.c: In function 'reservation': serveur_reservation.c:60: error: incompatible types in assignment serveur_reservation.c: In function 'main': serveur_reservation.c:125: error: incompatible type for argument 1 of 'bzero' serveur_reservation.c:144: error: incompatible types in assignment
le dernier c'est le serveur de consultation:
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stddef.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/shm.h>
/* macros ============================================================== */
#define err 500000 /*ca revoit 500000 en cas d'evenement introuvable */
#define PORTS 5100
#define CLE 100 /* cle du segment de mémoire */
#define CLES 500 /*clé du tableau de sémaphores*/
typedef struct{char const *id;char const *date;unsigned nbr_place;unsigned place_max;}evenement;
static evenement data[6];
typedef struct{char const *id;char const *date;}demande;
demande val;
int Max(int a,int b){if(a>b) return(a); else return(b);}
int consult()
{
int resultat=err;
int shmid, semid;
char *mem;
struct sembuf consultation;
/* récupération du segment de mémoire partagé avec la clé CLE*/
shmid=shmget(CLE,1000,0);
/*attachement du segment de memoire*/
mem=shmat(shmid,NULL,0);
/*recupération du tableau de sémaphores*/
semid=semget((key_t)CLES,2,0);
/* P(mutex)*/
consultation.sem_num=1;
consultation.sem_op=-1;
consultation.sem_flg=0;
semop(semid,&consultation,1);
/*incrément et test de NL*/
*mem=*mem+1;
if(*mem==1){
/* opération P(acces) */
consultation.sem_num=0;
consultation.sem_op=-1;
consultation.sem_flg=0;
semop(semid,&consultation,1);
}
/* opération p(mutex) */
consultation.sem_num=1;
consultation.sem_op=1;
consultation.sem_flg=0;
semop(semid,&consultation,1);
/*lecture de la mémoire */
data=mem;
/*traitement de consultation*/
static int i;
for(i=0;i<6;i++){
/*comparaitre les ID des événemenets*/
if(strncmp((char *)val.id,(char *)data[i].id,Max(sizeof(val.id),sizeof(data[i].id))))
{
/*comparaitre les dates des événemenets*/
if(strncmp((char *)val.date,(char *)data[i].date,Max(sizeof(val.id),sizeof(data[i].id))))
{
printf("je l'ai trouvé: il y a %c place libre \n", data[i].nbr_place);
resultat=data[i].nbr_place;}
}
}
/*fin de traitement de consultation*/
/*décrement et test de NL*/
*mem = *mem -1;
if(*mem==0){
/* opération v(acces)*/
consultation.sem_num=0;
consultation.sem_op=1;
consultation.sem_flg=0;
semop(semid,&consultation,1);
}
/* opération v(mutex) */
consultation.sem_num=1;
consultation.sem_op=1;
consultation.sem_flg=0;
semop(semid,&consultation,1);
return(resultat);
}
int main(void)
{
int retour,sock,ret;
struct sockaddr_in addr_serveur;
sock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(sock==-1){
perror("erreur de creation socket");
exit(1);
};
/* mise a zero de la mémoire d'adresse. */
bzero(&addr_serveur, sizeof(addr_serveur));
/* preparation de la structure adresse*/
addr_serveur.sin_family=AF_INET;
addr_serveur.sin_port =htons(PORTS);
addr_serveur.sin_addr.s_addr=INADDR_ANY; /*b n'import quelle adresse*/
if( bind(sock,(struct sockaddr *)&addr_serveur, sizeof(addr_serveur))<0)
{ perror("Erreur d'attachement: appel BIND");
exit (2);
};
for(;;)
{
struct sockaddr_in addr_client = { 0 };
int n;
char message[10];
bzero((int *)val.id,sizeof(val.id));
bzero((int *)val.date,sizeof(val.date));
printf("en attente de reception ...\n");
int lg=sizeof(addr_client);
if(n=recvfrom(sock,(struct evenement*)&val,sizeof(val)-1,0,(struct sockaddr *)&addr_client,&lg)>0){
printf("le nombre d'octets recus: %i\nl'evenement demandé est: %s \nladate de l'évenement est le %s\n",n,val.id ,val.date);
ret=consult();
sendto(sock, (int *)ret,sizeof(ret),0,(struct sockaddr *)&addr_client,lg);
}
else printf("erreur du recois du socket\n");
}
close(sock);
}
avec l'erreur suivante:
serveur_consultation.c: In function 'consult': serveur_consultation.c:75: error: incompatible types in assignment
j'éspere trouver ici comme d'habitude l'aide dont j'ai besoin, et pouvoir corriger mes erreurs.
merci d'avance
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
En vrac :
Le warning du process client est du au fait que tu ne dois lui transmettre l'ADRESSE de ta variable (c'est à dire &placelibre). De plus tu n'as pas défini le type de placelibre, juste indiqué que la variable n'est pas signée... Je pense que ça pourrait générer des erreurs par la suite mais j'en suis pas sûr.
Pour les autres, désolé mais trouver les lignes comme ça c'est pas évident... Pourrais-tu recopier les lignes qui buggent à la compilation avec genre les 2-3 lignes précédentes et les 2-3 lignes suivantes ?
Le warning du process client est du au fait que tu ne dois lui transmettre l'ADRESSE de ta variable (c'est à dire &placelibre). De plus tu n'as pas défini le type de placelibre, juste indiqué que la variable n'est pas signée... Je pense que ça pourrait générer des erreurs par la suite mais j'en suis pas sûr.
Pour les autres, désolé mais trouver les lignes comme ça c'est pas évident... Pourrais-tu recopier les lignes qui buggent à la compilation avec genre les 2-3 lignes précédentes et les 2-3 lignes suivantes ?