Я пишу приложение для получения многоадресных обновлений с устройства измерения тока, которое подключено к моей локальной сети. Устройство отправляет пакеты в группу многоадресной рассылки 224.192.32.19:22600 каждые несколько минут, и я могу их нормально читать с одного из хостов (Raspberry Pi).
Странно то, что когда я пытался добавить второй хост слушателя, я не мог найти многоадресный трафик из этой группы на ее интерфейсе.
Вся сеть находится в одном физическом месте, в одной подсети 192.168.xx. Между отправителем и получателем (ями) находятся 2 маршрутизатора TP-Link WDR3600 с DD-WRT и "тупой" 8-портовый гигабитный коммутатор TP-Link (используется в качестве расширителя портов). Все подключено через Ethernet.
Более подробная информация:
- Хосты "NOK" включают в себя ноутбук с Windows 7, подключенную к Linux виртуальную машину на том же ноутбуке и другой ноутбук с Linux
- подключение хоста "NOK" непосредственно к немому коммутатору, где хост "OK" не имеет никакого эффекта
- подключение напрямую к вторичному маршрутизатору (1 Ethernet-узел, расположенный ближе к источнику) не имеет никакого эффекта
Я не могу найти трафик IGMP для этой группы ни на одном из хостов, включая рабочий- отслеживая сетевой трафик для IGMP, я вижу 2 запроса на присоединение к
224.0.0.22
когда мое приложение запускается.
Членство в группе регистрируется ядром и отображается
~ $ netstat -ng
IPv6/IPv4 Group Memberships
Interface RefCnt Group
--------------- ------ ---------------------
lo 1 224.0.0.1
eth0 1 224.192.32.19
eth0 1 224.0.0.251
eth0 1 224.0.0.1
Код Python, который инициализирует сокет из приложения слушателя, выглядит так:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((self.mcast_group, self.mcast_port))
mreq = struct.pack("4sl", socket.inet_aton(self.mcast_group), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
Что мне здесь не хватает? Достаточно просто запустить приложение прослушивателя на рабочем хосте, чтобы получить многоадресный трафик. Почему это не относится к дополнительным прослушивателям?