Широковещательная и одноадресная передача UDP через один и тот же сокет?
Вопрос
У меня есть приложение для Linux, которое открывает сокет UDP и привязывает его к порту.У меня не было проблем с отправкой одноадресных пакетов через сокет.У меня была возможность отправить широковещательный пакет, поэтому я включил SO_BROADCAST, что позволяло проходить широковещательным пакетам, но затем я заметил, что одноадресные пакеты также передаются широковещательно.Это ожидаемое поведение для сокета UDP или, скорее всего, я что-то неправильно настроил?
Решение
Насколько я понимаю SO_BROADCAST это опция сокета.Поэтому, если вы включите его в своем сокете, этот сокет будет транслировать.Я предполагаю, что вам нужно будет открыть разные сокеты, если вы хотите выполнять одноадресную и широковещательную рассылку из одного и того же кода.
Другие советы
Я здесь не особо занимался программированием, но вам, вероятно, потребуется предоставить дополнительную информацию о библиотеке, версии ОС, коде и т. д.Может быть, пример кода?
Если я помню книги, которые читал, если вы установите флаг на сокете, это повлияет на все датаграммы, отправленные из сокета, потому что сокет представляет собой, по сути, структуру данных сетевых флагов + файловый дескриптор.
Я обнаружил ту же проблему в Linux, связанную с одновременным одноадресным и широковещательным доступом сокета.Я решил проблему следующим образом (псевдокод):
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
- Откройте розетку
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &1)
- Разрешает входящую и исходящую трансляцию из этого сокета.
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()
.