Широковещательная и одноадресная передача UDP через один и тот же сокет?

StackOverflow https://stackoverflow.com/questions/800302

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

Другие советы

Я здесь не особо занимался программированием, но вам, вероятно, потребуется предоставить дополнительную информацию о библиотеке, версии ОС, коде и т. д.Может быть, пример кода?

Если я помню книги, которые читал, если вы установите флаг на сокете, это повлияет на все датаграммы, отправленные из сокета, потому что сокет представляет собой, по сути, структуру данных сетевых флагов + файловый дескриптор.

Я обнаружил ту же проблему в Linux, связанную с одновременным одноадресным и широковещательным доступом сокета.Я решил проблему следующим образом (псевдокод):

  1. sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
    • Откройте розетку
  2. setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &1)
    • Разрешает входящую и исходящую трансляцию из этого сокета.
  3. bind(sock, bindaddr, sizeof(struct sockaddr) с

bindaddr.sin_family = AF_INET

bindaddr.sin_port = <YourPort>

bindaddr.sin_addr.s_addr = INADDR_ANY

  • Получайте все входящие сообщения на любую карту за <YourPort>

Предостережение заключается в том, что фильтрация отсутствует (см. предостережение в пункте 3).Таким образом, вы получите все сообщения.Отправленные сообщения передаются либо в одноадресной, либо в широковещательной рассылке в зависимости от заданного адреса в sendto().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top