Я пытаюсь присоединиться к многоадресному потоку IGMP с машины Centos 8, но после отправки JOIN трафик с коммутатора отсутствует.
Простое подключение:
Мультиплексор <-----------> cisco3850 <--------> Centos8
192.168.117.13 192.168.117.21
Восходящий коммутатор (Cisco Catalyst 3850) получает MPEG-TS на 239.1.1.1:4000 от мультиплексора.
я пробовал оба сокат
и моя собственная программа для открытия сокета, присоединения к потоку и удержания сокета открытым. Оба отправляют одно и то же сообщение о присоединении к IGMP, подтвержденное wireshark:
Протокол управления группой Интернета
[Версия IGMP: 3]
Тип: Отчет о членстве (0x22)
Зарезервировано: 00
Контрольная сумма: 0xe9fb [верно]
[Статус контрольной суммы: Хороший]
Зарезервировано: 0000
Количество групповых записей: 1
Групповая запись: 239.1.1.1 Изменить режим исключения
Тип записи: Изменить на режим исключения (4)
Длина дополнительных данных: 0
Номер источника: 0
Многоадресный адрес: 239.1.1.1
С использованием ip маршрут добавить
Я создал маршруты для мультикаст-групп к интерфейсу:
224.0.0.0/4 dev eth1 ссылка на область видимости
225.0.0.0/8 dev eth1 ссылка на область видимости
239.0.0.0/8 dev eth1 ссылка на область видимости
и кот /proc/net/igmp
показывает, что к группе присоединились:
кот /proc/net/igmp
Устройство Idx: подсчет пользователей Querier Group Timer Reporter
3 эт1 : 2 В3
030101E1 1 0:00000000 0
010000E0 1 0:00000000 0
я подозревать это проблема с коммутатором, а не с Linux, но клиент (владеющий коммутатором) говорит, что все в порядке.
Что еще я могу сделать на стороне Linux, чтобы исследовать/исправить эту проблему?
Если проблема в коммутаторе, то в чем? Что там нужно настроить? (необходимо объяснить клиенту)
Для справки, моя программа, которая присоединяется и удерживает сокет открытым, выглядит так:
// Проверка ошибок для краткости опущена
fd = сокет (PF_INET, SOCK_DGRAM, IPPROTO_IP);
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes);
memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = PF_INET;
saddr.sin_addr.s_addr = mcastAddr;
saddr.sin_port = htons (порт);
bind(fd, (struct sockaddr *)&saddr, sizeof(saddr);
структура ip_mreq mcastReq;
mcastReq.imr_multiaddr.s_addr = mcastAddr;
&mcastReq.imr_interface.s_addr = адрес_интерфейса;
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mcastReq, sizeof(mcastReq);