Développement client/serveur

Fermé
redanovich - 22 juin 2008 à 11:26
Sri Lumpa Messages postés 177 Date d'inscription mercredi 14 novembre 2007 Statut Membre Dernière intervention 1 juin 2010 - 23 juin 2008 à 16:54
Bonjour,
j'ai une application client-serveur à programmer sous linux, mais j'ai quelque erreurs que je n'arrive pas a corriger;
est ce qu'il y a quelqu'un ici qui peux m'aider

5 réponses

arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
22 juin 2008 à 11:54
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 :)
0
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:
#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
0
redanovich Messages postés 5 Date d'inscription dimanche 22 juin 2008 Statut Membre Dernière intervention 17 mars 2010
22 juin 2008 à 17:55
je vois que mes codes vous font reflechir :)
0
redanovich Messages postés 5 Date d'inscription dimanche 22 juin 2008 Statut Membre Dernière intervention 17 mars 2010
23 juin 2008 à 13:55
il ya qq ici ou suis-je seul ici!!!!!.???????????????????
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Sri Lumpa Messages postés 177 Date d'inscription mercredi 14 novembre 2007 Statut Membre Dernière intervention 1 juin 2010 68
23 juin 2008 à 16:54
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 ?
0