Socket et décrémentation client serveur

ichigoZ710 Messages postés 55 Date d'inscription mardi 16 octobre 2007 Statut Membre Dernière intervention 15 novembre 2011 - 2 nov. 2009 à 14:38
ichigoZ710 Messages postés 55 Date d'inscription mardi 16 octobre 2007 Statut Membre Dernière intervention 15 novembre 2011 - 2 nov. 2009 à 14:40
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.

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);
}


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.

1 réponse

ichigoZ710 Messages postés 55 Date d'inscription mardi 16 octobre 2007 Statut Membre Dernière intervention 15 novembre 2011
2 nov. 2009 à 14:40
Désolé, j'ai oublié de préciser que la fonction que j'ai présenté ici sert comme suit :

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");
0
Rejoignez-nous