Rechercher : dans
Par :

Client/Serveur en C avec signaux

byakuichi, le 2 nov 2009 à 18:59:17 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « Client/Serveur en C avec signaux » dans :
Environnement Client/Serveur Voir Présentation de l'architecture d'un système client/serveur De nombreuses applications fonctionnent selon un environnement client/serveur, cela signifie que des machines clientes (des machines faisant partie du réseau) contactent un serveur, une...
Réseaux - Architecture client/serveur à 3 niveaux VoirPrésentation de l'architecture à 2 niveaux L'architecture à deux niveaux (aussi appelée architecture 2-tier, tier signifiant rangée en anglais) caractérise les systèmes clients/serveurs pour lesquels le client demande une ressource et le serveur la...