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 eu posso lê-los bem em um dos hosts (um pi de framboesa).
O mais estranho é que, quando tentei adicionar um segundo host do listener, não consegui encontrar nenhum tráfego multicast desse grupo em sua interface.
O layout da rede é o seguinte:
Todaaredeestánomesmolocalfísico,sobamesmasub-rede192.168.x.x.Entreoremetenteeo(s)receptor(es),hádoisroteadoresTP-LinkWDR3600executandooDD-WRTeumswitchgigabitTP-Linkde8portas"dumb" (usado como um expansor de portas). Tudo é conectado via ethernet.
Mais detalhes:
- Os hosts "NOK" incluem um laptop com Windows 7, Linux VM conectado no mesmo laptop e um laptop Linux diferente
- conectando um host "NOK" diretamente ao comutador dumb onde o host "OK" não tem efeito
- ligar diretamente ao roteador secundário (1 "salto" de 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 de trabalho
- bisbilhotando o tráfego de rede para IGMP, posso ver duas solicitações de associação saindo para
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? Simplesmente executar o aplicativo ouvinte no host funcional foi o suficiente para receber o tráfego multicast, por que não é o caso dos ouvintes adicionais?