Bonjour,
j'aurais aimé savoir comment résoudre un problème sur lequel je planche depuis un petit moment déjà.
En gros j'ai un serveur sur lequel des clients se connectent. Arrivé à un nombre prévu de clients (ex : 2) le serveur doit empecher le client de se connecter. (or chez moi il veut pas...)
En plus, lorsque qu'un client se déconnecte la variable num_connect doit se décrémenter pour permettre si un autre client se connecte de l'accepter sinon il est sensé etre refusé (ici se n'est pas encore le cas, le serveur acceptant tous les clients meme si le nombre est dépassé)
Le problème est que je ne sais pas comment faire gérer la décrémentation de la variable. Je suppose que je dois utiliser le fait d'avoir un signal SIGCHLD dans le père et à la reception de ce signal décrémenter ma variable.
On m'a dit dans mon cours d'utiliser la structure sigaction mais je ne vois pas du tout comment m'en servir dans ce cas précis.
Code C :
void sigact_sigchld(int sig, siginfo_t *info, void *ignore) {
printf("resultat : %d\n", waitpid(info->si_pid, NULL, 0));
nb_connect--;
printf("Nombre de clients restants maintenant : %d\n", nb_connect);
}
--> Si j'ai bien compris il est sensé utiliser la fonction ci-dessus uniquement lorsque le signal SIGCHLD est capté par le père.
Bon je pense avoir tout expliquer de mon problème. Mais je ne pense pas etre très clair. Donc si quelqu'un se penche dessus, je répondrais à ces questions avec grand plaisir.
Merci.
P.S : la fonction que j'ai présenté ici sert comme suit :
Code C :
act.sa_handler = NULL;
act.sa_sigaction = sigact_sigchld;
act.sa_mask = set;
act.sa_flags = SA_SIGINFO;
if(sigaction(SIGCHLD, &act, NULL)) perror("Erreur lors de l'appel de sigaction\n");
if(nb_connect < nb_max_connect)
{
nb_connect++;
accept_connect = 1;
printf("Vous êtes le client numero : %d\n",nb_connect);
}
else
{
accept_connect = 0;
printf("Nombre de clients atteint\n");
envoi_message(csock,"Nombre de clients atteint\n",strlen("Nombre de clients atteint\n"),MSG_NOSIGNAL);
}
Configuration: Linux Suse
Firefox 3.0.14