2010-06-06 5 views
5

Je dois écrire un serveur qui accepte les connexions de plusieurs machines clientes, assure le suivi des clients connectés et envoie les données des clients individuels selon les besoins. Parfois, tous les clients peuvent être contactés en même temps avec le même message, d'autres fois, il peut s'agir d'un client individuel ou d'un groupe de clients.Connexions à plusieurs sockets

Comme j'ai besoin de confirmation que les clients ont reçu l'information et ne veulent pas construire une structure ACK pour une connexion UDP, j'ai décidé d'utiliser une méthode de diffusion TCP. Cependant, j'ai eu du mal à comprendre comment maintenir plusieurs connexions et les garder inactif.

Je semble avoir trois options. Utilisez une fourchette pour chaque connexion entrante pour créer un processus enfant séparé, utilisez pthread_create pour créer un nouveau thread complet pour chaque processus ou utilisez select() pour attendre tous les ID de socket ouverts pour une connexion.

Recommandations sur comment attaquer ceci? J'ai commencé à travailler avec pthreads mais comme les performances ne poseront probablement pas de problème, le traitement multicœur n'est pas nécessaire et il existe peut-être un moyen plus simple.

+0

Comme une note, je travaille en C/C++ – BSchlinker

+0

Je devrais également mentionner, le nombre de connexions à ce système sont statiques. Ce n'est pas une machine publique (les connexions ne changeront pas au fil du temps - c'est-à-dire que je ne vois pas de problème de performance). – BSchlinker

+1

Personnellement, je voudrais multiplexer using select(), ou de préférence kqueue() si fonctionnant sur mac ou bsd. L'une ou l'autre des trois options fonctionnerait, cependant, et les options pthread/fork sont très faciles à implémenter si votre serveur doit avoir un faible nombre de clients et un faible conflit de client actif. –

Répondre

5

Les processus enfants ne sont pas agréables, car vous déplacez simplement le poteau de but. Vous devrez faire en sorte que vos processus fils communiquent les uns avec les autres, puis vous revenez au même problème.

Il est possible d'utiliser des threads, mais vous aurez d'autres problèmes si vos threads continuent à bloquer sur la réception socket. Select() (ou poll() sur les plus récents (POSIX) Unix) est toujours la meilleure solution. Vous dites à select() ou à poll() quels sockets ou descripteurs vous voulez surveiller pour les événements (probablement juste les événements de saisie (read) vous suffisent), alors vous faites la lecture seulement sur ce socket ou ce descripteur qui a été marqué par select()/sondage(). Il est garanti que recv() ne bloquera pas.

4

Lisez la page C10K pour tout un tas d'options. Lisez ensuite l'article High Performance Server Architecture. Ceux-ci répondront à beaucoup de questions pour vous.

J'irais avec la troisième option. Pour cela regarder dans epoll(4) et/ou kqueue(2) installations pour performants modernes select/poll remplacements.

+0

+1 pour epoll(). Vous pouvez également regarder boost :: asio, qui abstinera beaucoup de travail. – Thanatos

+1

Oui, 'boost :: asio' est l'une des options pour C++. C'est mentionné sur les pages que j'ai liées. –

Questions connexes