1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
|
#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);
} |
Partager