2009-10-24 6 views
0

J'ai reçu un socket serveur non bloquant C++, tous les clients étant stockés dans une structure std :: map.C++ envoyer des données à plusieurs sockets UDP

Je peux appeler la méthode send() pour chaque clientObject d'envoyer quelque chose au client connecté et qui fonctionne très bien déjà. Mais pour envoyer un message à tous (diffusion?) Je veux savoir: il y a quelque chose de mieux que de faire une boucle/avec tous les clients et d'appeler ClientObject-> send ("foo") chaque itération? Ou devrais-je juste essayer d'avoir un coup d'oeil sur les prises multicast?

Merci d'avance. Rag.

+2

Avez-vous envisagé d'utiliser la bibliothèque ASIO? http://asio.sourceforge.net/ –

+0

Comment exactement la bibliothèque ASIO aide-t-elle le PO? – Tom

Répondre

1

La multidiffusion est uniquement une option si vous communiquez via un réseau local. Cela ne fonctionnera pas sur Internet.

Ce que vous pouvez faire ici est de démultiplexer les prises à l'aide d'E/S asynchrones. Cela vous permet d'envoyer des données à plusieurs sockets en même temps et d'utiliser des gestionnaires d'événements asynchrones pour gérer chaque transmission.

Je recommanderais de regarder dans Boost ASIO pour une façon portable de le faire. Vous pouvez également utiliser des appels système spécifiques à un système d'exploitation (tels que poll/select sous UNIX ou epoll sous Linux) pour le faire, mais c'est beaucoup plus compliqué.

+0

La multidiffusion fonctionne sur Internet, compte tenu de certaines restrictions et d'une bonne configuration de routeur qui est généralement oubliée par la plupart des administrateurs réseau. Juste un exemple, vous pouvez écouter la radio de haute qualité ou regarder la télévision de haute qualité de la BBC sur la multidiffusion: http://www.bbc.co.uk/multicast/ – Juliano

1

Multicast serait bien préférable ... aussi longtemps que vous parlez des nœuds locaux à savoir dans le domaine « broadcast/multicast » sur le réseau local.

Bien sûr, il existe des protocoles de distribution de multidiffusion pour une plus grande dispersion de ces messages, mais ils sont rarement utilisés et, selon votre cas, vous pourriez/fiabilité ne pouvait pas dépendre de cette installation.

L'utilisation de Multicast se traduit par beaucoup d'économies d'un point de vue de l'expéditeur: une seule opération d'envoi doit se produire au lieu de n * envoyer.

0

Vous feriez mieux de faire unidiffusion UDP à chaque hôte, sauf si vous avez ces commutateurs très coûteux. Oui, la diffusion/multidiffusion peut en fait être plus lente pour la plupart des commutateurs qui ont beaucoup plus de puissance CPU que vos PCs. Faire autre chose qu'une simple transmission les ralentirait énormément.

Faites un benchmark pour le savoir.

0

La programmation d'une socket Asynch est définitivement la solution! :)

Questions connexes