-
La fonction d'initialisation du serveur :
int initialisationServeur(short int *port,int connexions)
{
int df;
struct sockaddr_in adresse;
int statut;
int taille=sizeof adresse;
/* Creation d'une socket */
df=socket(PF_INET,SOCK_STREAM,0);
if(df<0){
perror("initialisationServeur.socket");
exit(-1);
}
/* On fixe l'adresse de la socket */
adresse.sin_family=AF_INET;
adresse.sin_addr.s_addr=INADDR_ANY;
adresse.sin_port=htons(*port);
statut=bind(df,(struct sockaddr *)&adresse,sizeof(adresse));
if(statut<0) return -1;
/* On recupere le numero du port utilise */
statut=getsockname(df,(struct sockaddr *)&adresse,&taille);
if(statut<0){
perror("initialisationServeur.getsockname");
exit(-1);
}
*port=ntohs(adresse.sin_port);
/* Initialisation de l'ecoute */
statut=listen(df,connexions);
if(statut<0) return -1;
return df;
}
- La fonction de gestion des clients :
int boucleServeur(int ecoute,int (*traitement)(int))
{
struct sockaddr_in adresse;
int taille=sizeof adresse;
int dialogue;
while(1){
/* Attente d'une connexion */
dialogue=accept(ecoute,(struct sockaddr *)&adresse,&taille);
if(dialogue<0) return -1;
/* Passage de la socket de dialogue a la fonction de traitement */
if(traitement(dialogue)<0){ close(ecoute); return 0;}
}
}
int gestionClient(int sd){
int pid;
int statut;
pid=fork();
if(pid<0){perror("fork"); exit(-1);}
if(pid!=0)
close(sd);
else{
dup2(sd,0); dup2(sd,1); dup2(sd,2);
statut=execl(CHEMIN_PROGRAMME,CHEMIN_PROGRAMME,NULL);
}
return 0;
}
- La fonction principale :
int main(int argc,char *argv[])
{
int s; /* Descripteur de la SOCKET */
/* Lecture des arguments de la commande */
analyseArguments(argc,argv);
/* Initialisation du serveur */
s=initialisationServeur(&port,MAX_CONNEXIONS);
/* Mise en place de la procedure de recuperation de la mort d'un fils */
signal(SIGCHLD,mortdefils);
/* Lancement de la boucle d'ecoute */
boucleServeur(s,gestionClient);
}