Pregunta

Obtuve un socket de servidor no bloqueante de c ++, con todos los clientes almacenados en una estructura std :: map.

Puedo llamar al método send () para que cada clientObject envíe algo al cliente conectado y eso ya funciona bastante bien.

Pero para enviar un mensaje a todos (¿emitir?) quiero saber: hay algo mejor que hacer un for / loop con todos los clientes y llamar a ClientObject- > ¿enviar (" foo ") cada iteración?

¿O debería intentar echar un vistazo a los sockets de multidifusión?

Gracias de antemano. Trapo.

¿Fue útil?

Solución

La multidifusión es solo una opción si se está comunicando a través de una LAN. No funcionará a través de Internet.

Lo que puede hacer aquí es demultiplexar los sockets utilizando E / S asíncronas. Esto le permite enviar datos a múltiples sockets al mismo tiempo y usar controladores de eventos asíncronos para tratar con cada transmisión.

Recomendaría buscar en Boost ASIO una forma portátil de hacerlo. También puede usar llamadas al sistema específicas del sistema operativo (como poll / select en UNIX o epoll en Linux) para hacer esto, pero es mucho más complicado.

Otros consejos

La multidifusión sería mucho más preferible ... siempre que esté hablando de nodos locales, es decir, dentro de la " difusión / multidifusión " dominio en la LAN.

Por supuesto, existen protocolos de distribución de multidifusión para una dispersión más amplia de dichos mensajes, pero rara vez se utilizan y, dependiendo de su caso específico, podría / no podría depender de esa facilidad.

El uso de multidifusión se traduce en muchos ahorros desde el punto de vista del remitente: solo debe realizarse una operación de envío en lugar de n * enviar.

Será mejor que haga udp unicast para cada host a menos que tenga esos switches muy caros. Sí, la transmisión / multidifusión puede ser más lenta para la mayoría de los conmutadores que tienen una CPU mucho más inteligente que sus PC. Hacer algo más que un simple reenvío los ralentizaría enormemente.

Haz un punto de referencia para averiguarlo.

¡La programación de sockets asíncronos es definitivamente el camino a seguir! :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top