2

I'm trying to make a Raspberry (on Raspbian) receiving UDP multicast messages. I'm using the following code with Python 3:

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(("239.0.0.1", 22700))
mreq = struct.pack("4sl", socket.inet_aton("239.0.0.1"), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

while True:
    data = sock.recv(32).decode("utf8")
    # Do stuff with the received data

This code is working fine, I'm receiving the desired packets but after a while, usually 5 minutes, the sock.recv(32) gets stuck and nothing is received anymore. The exact same code works perfectly on my computer, it's been running for more than an hour now, receiving all packets.

Has anyone been confronted to this on a Raspberry ? Thanks in advance

Rémi Rigal
  • 134
  • 5
  • 1
    Possible duplicate of [Refresh multicast group membership](https://stackoverflow.com/questions/10913509/refresh-multicast-group-membership) – Klaus D. Nov 11 '18 at 15:29
  • Thank you @KlausD. you are right, the multicast group membership is never refreshed on my Raspberry. Unfortunately I can't get it worked, I tried disabling the `rp_filter` but it doesn't change anything. The only way it works is by calling: sock.setsockopt(socket.IPPROTO_IP, socket.IP_DROP_MEMBERSHIP, mreq) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) but it's ugly... – Rémi Rigal Nov 11 '18 at 16:50

1 Answers1

1

This sounds like a typical IGMP problem. These kind of problems are frequent. The typical pattern is that everything works as it should and after some time it stops working.

Some router or switch along the path stops transporting your multicast packets. Look for options in the router to enable/disable IGMP snooping and potentially enable/disable different IGMP versions. Try a different switch. Avoid exotic hardware (like PowerLine adapters).

Johannes Overmann
  • 4,914
  • 22
  • 38