Каковы варианты отправки одних и тех же данных двум независимым потребителям на одном компьютере по протоколу UDP? - PullRequest
0 голосов
/ 04 апреля 2019

Предположим, у меня есть производитель, расположенный на одной машине, и два независимых потребителя на другой.Потребители имеют один и тот же IP.Я хочу, чтобы мои данные отправлялись через WiFi, и я хочу избежать отправки одних и тех же пакетов дважды: я имею в виду, что я хочу, чтобы пакеты реплицировались как можно позже - либо на маршрутизаторе, либо на конечном компьютере.

Iудалось найти следующие варианты:

1) Просто использовать разные порты - в этом случае все будет отправлено дважды, но по крайней мере все потребители получат свои копии данных.

2) Попробуйтеиспользовать SO_REUSEPORT - без многоадресной передачи это заставит только один из двух потребителей получить пакеты.

3) Использовать многоадресную рассылку (с SO_REUSEADDR) - я думаю, это единственное решение для моей проблемы,и пакеты будут реплицироваться маршрутизатором, а не издателем.

Я знаю, что существуют библиотеки и платформы обмена сообщениями, которые должны отвечать за маршалинг и маршрутизацию, но мне нужно «чистое» решение UDP с возможнонекоторая простая логика на это.Я не уверен, что я прав в отношении вариантов, которые я упомянул, и не знаю, существует ли какое-либо более простое и подходящее решение.

1 Ответ

0 голосов
/ 05 апреля 2019

Как люди говорили вам в комментариях, одно популярное и эффективное решение вашей проблемы (один издатель с несколькими подписчиками по сети, он же pubsub) - это отправка дейтаграмм UDP на многоадресный IP-адрес . Слушатели должны присоединиться к этой многоадресной IP-группе, чтобы указать промежуточным маршрутизаторам пересылать эти дейтаграммы.

Вы можете сами его кодировать, в другом месте множество примеров.

Однако в производственных условиях я не рекомендую изобретать велосипед вместе с ошибками. Посмотрите на существующие решения, такие как ZeroMQ . Он поддерживает этот шаблон обмена сообщениями от одного издателя к нескольким подписчикам, используя многоадресную передачу UDP / IP, но с приятным интерфейсом, мультиязычностью и многим другим. См. Пример публикации / подписки на Python .

...