-
La fonction d'initialisation d'un serveur IPv4 :
int initialisationServeur(short int *port,int connexions){
{
int df;
struct sockaddr_in adresse;
socklen_t taille=sizeof adresse;
int statut;
/* Creation d'une socket */
df=socket(PF_INET,SOCK_STREAM,0);
if(df<0){
perror("initialisationServeur.socket");
exit(-1);
}
/* Specification de 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);
/* Taille de la queue d'attente */
statut=listen(df,connexions);
if(statut<0) return -1;
return df;
}
- La fonction d'initialisation d'un serveur IPv6 :
int initialisationServeur(short int *port,int connexions){
int df;
struct sockaddr_in6 adresse;
socklen_t taille=sizeof adresse;
int statut;
/* Creation d'une socket */
df=socket(PF_INET6,SOCK_STREAM,0);
if(df<0){
perror("initialisationServeur.socket");
exit(-1);
}
/* Specification de l'adresse de la socket */
adresse.sin6_family=AF_INET6;
adresse.sin6_addr=in6addr_any;
adresse.sin6_port=htons(*port);
adresse.sin6_flowinfo=0;
adresse.sin6_scope_id=0;
statut=bind(df,(struct sockaddr *)&adresse,taille);
if(statut<0) return -1;
/* Recuperation du numero du port utilise */
statut=getsockname(df,(struct sockaddr *)&adresse,&taille);
if(statut<0){
perror("initialisationServeur.getsockname");
exit(-1);
}
*port=ntohs(adresse.sin6_port);
/* Taille de la queue d'attente */
statut=listen(df,connexions);
if(statut<0) return -1;
return df;
}
- La fonction de gestion des clients :
int boucleServeur(int ecoute,int (*traitement)(int))
{
int dialogue;
while(1){
/* Attente d'une connexion */
if((dialogue=accept(ecoute,NULL,NULL))<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;
/* Lecture des arguments de la commande */
analyseArguments(argc,argv);
/* Initialisation du serveur */
s=initialisationServeur(&port,MAX_CONNEXIONS);
/* Lancement de la boucle d'ecoute */
boucleServeur(s,gestionClient);
}