Отключение самостоятельного приема UDP-трансляций - PullRequest
3 голосов
/ 21 декабря 2010

Я хочу знать, есть ли способ отключить широковещательный пакет UDP от узла A, чтобы он не был получен самим узлом A.

Для braodcast я просто использую INADDR_BROADCAST и на сторона получателя я использую AI_PASSIVE | AI_NUMERICHOST.

Ответы [ 3 ]

2 голосов
/ 16 ноября 2011

Привязка к интерфейсу, а не только к адресу.

  #include <net/if.h>
  #include <socket.h>

  struct ifreq interface;
  strcpy(interface.ifr_ifrn.ifrn_name, "eth0");

  int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
  setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, &interface, sizeof(interface));

  //... bind(fd,...) ...

Таким образом, данные, которые не поступили на указанный интерфейс (но вместо этого были получены от него), не будут получены.

2 голосов
/ 23 декабря 2010

Нет, это фундаментальное свойство широковещания - каждый хост в подсети, включая отправителя, должен будет обрабатывать пакет на всем протяжении сетевого стека.Доступны следующие варианты:

  • Переключиться на многоадресная рассылка .Это предпочтительнее, поскольку многоадресная рассылка снижает нагрузку на всю сеть по сравнению с широковещательной рассылкой, а также потому, что вы можете явно управлять многоадресной обратной связью с опцией сокета IP_MULTICAST_LOOP.
  • Не bind(2) порт назначения на отправляющем аппарате.Это работает, но немного глупо, поскольку накладывает ограничения на разработку и / или развертывание приложений.
1 голос
/ 20 апреля 2017

Вот результаты моих экспериментов с библиотекой сокетов Python.Будет ли UDP-вещатель принимать сообщения, отправленные сам, зависит от того, к какому адресу вы будете привязывать широковещательный сокет.Для большей ясности, IP-адрес вещателя был 192.168.2.1.

  • При привязке к '192.168.2.255' или '' (пустой адрес), вещатель получает сообщения, отправленные сам по себе
  • КогдаПри связывании с «192.168.2.1», «255.255.255.255» или «» вещатель НЕ будет принимать сообщения, отправленные им самим

Получатель получал широковещательные сообщения UDP во всех этих случаях.

PS Протестировано на Python 2.7.9, ОС Raspbian 8 (адаптация Debian для Raspberry Pi), ядро ​​Linux 4.4.38

...