Мне нужно отправить многоадресный udp с многосетевого компьютера. Обнаружено, что в случае, если сокет не привязан к какому-либо конкретному интерфейсу, будет использоваться интерфейс по умолчанию (что бы это ни значило). Мой вопрос: можно ли указать что-то вроде inaddr_any для отправки многоадресного udp со всех доступных интерфейсов или это возможно сделать только путем перечисления всех интерфейсов и ручной отправки с каждого? Есть ли стандарт для этого? Спасибо

0
BbIKTOP 14 Апр 2020 в 06:31

1 ответ

Вы можете указать, с какого сетевого интерфейса будут отправляться многоадресные пакеты IPv4, установив параметр сокета IP_MULTICAST_IF. Значение, переданное setsockopt, должно быть адресом struct in_addr, содержащим IP-адрес рассматриваемого интерфейса.

Если вы хотите отправить многоадресный пакет на несколько интерфейсов, вам нужно будет вызывать sendto несколько раз, устанавливая параметр IP_MULTICAST_IF перед каждым.

0
dbush 14 Апр 2020 в 06:40
Я понимаю, что я могу явно установить интерфейс. Я спросил о другом. Вопрос такой: 1) можно ли отправлять через все интерфейсы, не отправляя вручную через каждый интерфейс? 2) есть ли стандартный документ, описывающий такое поведение?
 – 
BbIKTOP
14 Апр 2020 в 06:45
Пакет может уйти только с одного интерфейса. Вам нужно будет пройти через них, чтобы отправить из более чем одного.
 – 
dbush
14 Апр 2020 в 06:46
Я не могу использовать анонимный комментарий в качестве ссылки. Это указано в каком-то нормативном документе?
 – 
BbIKTOP
14 Апр 2020 в 12:27
Я не знаю ни одного стандартного документа, касающегося того, как должны работать сокеты. API сокетов возник в BSD UNIX, и другие ОС подобрали его с небольшими отличиями здесь и там.
 – 
dbush
14 Апр 2020 в 14:27
Я спросил о стандартах, я знаю, как это работает в bsd и т. д., но спасибо, что сообщили мне, что вы не в курсе.
 – 
BbIKTOP
14 Апр 2020 в 14:29