Estou escrevendo um aplicativo para obter atualizações multicast de um dispositivo de medição de corrente conectado à minha LAN. O dispositivo envia pacotes para o grupo multicast 224.192.32.19:22600 a cada poucos minutos, e posso lê-los perfeitamente em um dos hosts (um raspberry pi).
O estranho é que quando tentei adicionar um segundo host ouvinte, não consegui encontrar nenhum tráfego multicast desse grupo em sua interface.
O layout da rede é o seguinte:
Toda a rede está no mesmo local físico, na mesma sub-rede 192.168.xx. Entre o remetente e o (s) receptor (es) há 2 roteadores TP-Link WDR3600 executando DD-WRT e um switch gigabit "burro" de 8 portas TP-Link (usado como expansor de porta). Tudo está conectado via Ethernet.
Detalhes adicionais:
- Os hosts "NOK" incluem um laptop Windows 7, uma VM Linux em ponte no mesmo laptop e um laptop Linux diferente
- conectar um host "NOK" diretamente ao switch burro onde o host "OK" está não tem efeito
- conectar diretamente ao roteador secundário (1 "salto" Ethernet mais próximo da fonte) não tem efeito
Não consigo encontrar nenhum tráfego IGMP para esse grupo em nenhum dos hosts, incluindo o que está funcionando- espionando o tráfego de rede para IGMP, posso ver duas solicitações de adesão saindo
224.0.0.22
quando meu aplicativo é iniciado.
A associação ao grupo é registrada pelo kernel e exibida por
~ $ 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
O código Python que inicializa o soquete do aplicativo ouvinte é este:
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)
O que estou perdendo aqui? A simples execução do aplicativo ouvinte no host em funcionamento foi suficiente para receber o tráfego multicast. Por que não é o caso dos ouvintes adicionais?
Responder1
Acontece que este foi um problema do roteador, depois de reiniciar o roteador secundário, todos os hosts começaram a receber os pacotes multicast conforme o esperado.
Eu diria que foi um bug do DD-WRT ou alguma corrupção estatal que comprometeu a distribuição do tráfego multicast.