Je veux un programme serveur qui n'accepte qu'un maximum d'une connexion et qui doit ignorer les autres connexions. Comment puis-je atteindre cet objectif?comment limiter le nombre de connexions dans le programme du serveur client
Répondre
Seulement accept()
une seule connexion.
Voici une routine typique du serveur:
s = socket(...);
bind(s, ...);
listen(s, backlog);
while (-1 != (t = accept(s, ...))) {
// t is a new peer, maybe you push it into an array
// or pass it off to some other part of the program
}
Chaque terminé accept()
appel, renvoie le descripteur de fichier pour une nouvelle connexion. Si vous ne souhaitez recevoir qu'une seule connexion , seulement accept()
une fois. On peut supposer que vous avez terminé l'écoute après, alors fermez votre serveur aussi:
s = socket(...);
bind(s, ...);
listen(s, backlog);
t = accept(s, ...);
close(s);
// do stuff with t
Si vous souhaitez seulement gérer une seule connexion à la fois, et après que la connexion se ferme, reprendre l'écoute, puis effectuer la boucle accept()
ci-dessus , et acceptent d'autres connexions jusqu'à ce que t
ait fermé.
Voulez-vous rejeter toute connexion ou faire une file d'attente? Je pense que ce que vous cherchez est le soi-disant "singleton". Regardez le wikipadia pour le motif de conception Singleton.
Je ne pense pas qu'il trouvera le motif Singleton pour C;) – Prine
Corrections voir ci-dessous:
Vous pouvez définir le nombre de demandes acceptées dans la méthode
écouter.
listen(socketDescription, numberOfConnectionsPending);
Le second paramètre permet de régler le nombre de connexions en attente et non le nombre de connexions lui-même ..
Si vous définissez les
numberOfConnections à 1 tous les autres clients qui envoie un demande au serveur recevra un
erreur timeout ..
Ici vous pouvez trouver plus d'informations: http://shoe.bocks.com/net/#listen
J'ai lu la documentation d'écoute mal. Vous devriez travailler avec la méthode d'acceptation décrite dans la réponse de Matt.
Comment puis-je avertir l'utilisateur qu'une autre connexion est déjà active et que ce délai n'est pas dû à une panne de réseau? – Thangaraj
Est-il possible de vérifier si le descripteur de socket ouvert en dernier est actif ou non? – Thangaraj
Je pense que vous pouvez vérifier cela à la méthode accept. Mais je ne suis pas sûr. Accept() renvoie un entier positif qui est le descripteur de socket pour le socket accepté. Si une erreur se produit, -1 est renvoyé et errno est défini pour indiquer la cause. Consultez ce site Web: http://shoe.bocks.com/net/#accept – Prine
Merci pour vos précieux commentaires, En fait, comment puis-je savoir si la première connexion est déjà fermée ou non? parce que si ma première connexion est idéale pour une certaine période de temps? Si je reçois une nouvelle connexion, je dois vérifier si la première connexion est active ou non avant d'accepter cette nouvelle connexion.Avons-nous un moyen d'atteindre ce scénario? – Thangaraj
Lorsque vous lisez() 'depuis un socket que l'homologue a fermé, il renverra 0. Vous pouvez également le fermer vous-même, en appelant' close() 'ou' shutdown() '. Ne revenez pas de votre fonction 't' tant que vous n'êtes pas satisfait de la connexion. Gardez à l'esprit qu'il est possible de gérer plus d'une connexion à la fois, mais je suppose que gérer une seule connexion est ce que vous recherchez. –
Vraiment génial répondre Matt Jonier, nous avons ici un problème de plus, supposons que la lecture/écriture est gérée par son processus fils et la connexion est gérée par son processus parent. Dans ce cas, nous avons besoin d'IPC pour envoyer des données du processus parent au processus enfant si nous lisons réellement certaines données en utilisant read() pour vérifier l'état de la connexion, n'est-ce pas un surcoût? Avons-nous une solution pour cela aussi? J'ai une solution. Nous pouvons utiliser getpeername() pour vérifier l'état de la connexion active actuelle, y aurait-il des effets secondaires? Je ne suis pas sûr que cela corrige la solution? S'il vous plaît partagez votre pensée. – Thangaraj