#c #c #udp #winsock #multicast
#c #c #udp #winsock #многоадресная рассылка
Вопрос:
я пишу программу на C для Windows, которая должна отправлять сообщения нескольким одноранговым узлам, у каждого из которых разные IP и порт. нет необходимости гарантировать доставку сообщений. итак, я хочу отправить многоадресное сообщение, не ограниченное той же локальной сетью, в которой я нахожусь.
Как мне это сделать? должен ли я отправлять каждое сообщение отдельно каждому из одноранговых узлов или есть возможность отправить всем без повторения?
Нужно ли мне открывать сокет-соединение с каждым из одноранговых узлов?
Спасибо, Майкл.
Комментарии:
1. Привет, Майкл, откуда ты знаешь, что одноранговые узлы будут прослушивать? На какой адрес mcast они будут регистрироваться для этого приложения?
2. Привет, Майк, я могу предположить, что одноранговые узлы прослушивают через listen_port, который мне известен, но опять же, мне не нужно гарантировать доставку сообщения. я вообще не знаком с сокетом mcast, я хотел узнать, какие функции msdn следует использовать, и обычный рабочий процесс процесса — например, открыть сокет, привязать его к порту и т.д…
3. Майкл, многоадресная рассылка сильно отличается от одноадресной в том, как она работает… Поскольку ваши клиенты могут даже не находиться в одном сегменте локальной сети с вашим сервером, им необходимо зарегистрироваться в
IGMPv2
orIGMPv3
, чтобы сетевая инфраструктура знала, кому отправлять многоадресную рассылку. Кроме того, если сообщения mcast отправляются через маршрутизаторы, вашей ИТ-команде потребуется настроить это (обычно они делают это и на коммутаторах … обычно это не так важно), если этого еще нет. Я не программист Windows, поэтому я не могу комментировать проблемы, связанные с Windows.4. Вы уверены, что вам нужна многоадресная рассылка здесь? Похоже, вам просто нужно отправить одни и те же данные разным одноранговым узлам ie. используйте несколько «одноадресных» потоков. У вас будут накладные расходы на подключение и т.д., Если вам нужно использовать TCP. Если вы используете UDP вместо этого, вы должны иметь возможность адресовать свой запрос (не гарантированная доставка одних и тех же данных нескольким получателям)
Ответ №1:
Есть два распространенных способа сделать это.
Одноадресная рассылка UDP
Вы поддерживаете список получателей IP-адресов в своей программе, перебираете каждого получателя и отправляете копию каждой дейтаграммы каждому получателю.
Многоадресная IP-рассылка
Где-то должен существовать список получателей. Если вы используете многоадресную рассылку по IP, то список получателей поддерживается вашим сетевым оборудованием, обычно маршрутизатором или коммутатором уровня 3. Включите протокол управления интернет-группами (IGMP) в вашем маршрутизаторе, и тогда получатели смогут отправлять запросы IGMP на присоединение к маршрутизатору, чтобы добавить себя в многоадресную группу. Группа многоадресной рассылки определяется как конечная точка IP — IP-адрес и порт. В IPv4 адреса с 224.0.0.0 по 239.255.255.255 обозначаются как адреса многоадресной рассылки. Чтобы отправить дейтаграмму всем членам группы многоадресной рассылки, просто отправьте дейтаграмму один раз с помощью одноадресной рассылки UDP в конечную точку группы многоадресной рассылки. Затем маршрутизатор перешлет дейтаграмму всем членам группы.
Если получатели не находятся в той же локальной сети, что и вы, вы, вероятно, не сможете использовать многоадресную IP-рассылку. Многоадресная IP-рассылка будет работать, только если вы можете заранее знать сетевой маршрут для всех получателей, которые могут присоединиться к вашей группе многоадресной рассылки, и убедиться, что все сетевое оборудование настроено должным образом.
Вы не можете использовать многоадресную IP-рассылку через Интернет.