c ++ отправляет данные в несколько сокетов UDP - PullRequest
0 голосов
/ 24 октября 2009

Я получил неблокирующий сокет сервера c ++, все клиенты которого хранятся в структуре std :: map.

Я могу вызвать метод send () для каждого clientObject для отправки чего-либо подключенному клиенту, и это уже работает довольно хорошо.

Но для отправки сообщения всем (трансляция?) Я хочу знать: Есть что-то лучше, чем сделать цикл for / со всеми клиентами и вызывать ClientObject-> send ("foo") каждую итерацию?

Или мне просто попробовать взглянуть на многоадресные сокеты?

Заранее спасибо. Rag.

Ответы [ 4 ]

1 голос
/ 24 октября 2009

Многоадресная рассылка доступна только в том случае, если вы общаетесь по локальной сети. Это не будет работать через Интернет.

То, что вы можете здесь сделать, - это демультиплексировать сокеты с помощью асинхронного ввода-вывода. Это позволяет отправлять данные в несколько сокетов одновременно и использовать асинхронные обработчики событий для обработки каждой передачи.

Я бы порекомендовал взглянуть на Boost ASIO для портативного способа сделать это. Вы также можете использовать системные системные вызовы (например, poll / select в UNIX или epoll в Linux), но это намного сложнее.

1 голос
/ 24 октября 2009

Многоадресная рассылка была бы гораздо предпочтительнее ... если вы говорите о локальных узлах, то есть в домене "широковещательная / многоадресная передача" в локальной сети.

Конечно, существуют протоколы многоадресной рассылки для более широкого распространения таких сообщений, но они используются редко, и, в зависимости от вашего конкретного случая, вы могли / не могли надежно зависеть от такого средства.

Использование многоадресной передачи приводит к значительной экономии с точки зрения отправителя: вместо n * send требуется выполнить только одну операцию отправки.

0 голосов
/ 26 октября 2009

Программирование асинхронных сокетов - это определенно правильный путь! :)

0 голосов
/ 25 октября 2009

Лучше сделать unpast для каждого хоста, если у вас нет этих очень дорогих коммутаторов. Да, широковещательная / многоадресная передача на самом деле может быть медленнее для большинства коммутаторов, у которых ЦП намного слабее, чем у ваших ПК. Выполнение чего-либо, кроме простой пересылки, значительно замедлит их работу.

Сделайте тест, чтобы узнать.

...