Skip to content

Instantly share code, notes, and snippets.

@dgomes
Created June 28, 2021 21:06
Show Gist options
  • Save dgomes/a44211df24a6c72d7b06565e336e9533 to your computer and use it in GitHub Desktop.
Save dgomes/a44211df24a6c72d7b06565e336e9533 to your computer and use it in GitHub Desktop.
Python3 multicast socket with selectors example
import socket
import struct
import random
import selectors
MY_ID = random.randint(0, 100)
MC_GROUP = "224.0.0.69"
MC_PORT = 10000
mc_address = (MC_GROUP, MC_PORT)
# Create the socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setsockopt(
socket.SOL_SOCKET, socket.SO_REUSEPORT, 1
) # this line is only required for MacOS
# Bind to the server address
sock.bind(("", MC_PORT))
# Tell the operating system to add the socket to the multicast group
# on all interfaces.
group = socket.inet_aton(MC_GROUP)
mreq = struct.pack("4sL", group, socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
def got_message(sock, mask):
"""Callback function to process multicast packets received."""
data, address = sock.recvfrom(1024)
print("GOT", data, "from", address)
# Create selector and register callback
sel = selectors.DefaultSelector()
sel.register(sock, selectors.EVENT_READ, got_message)
# Wait for announces and periodically annouce as a keep alive
print(f"My ID is {MY_ID}")
sock.sendto(f"Hello from {MY_ID}".encode("ascii"), mc_address)
while True:
events = sel.select(timeout=5)
for key, mask in events:
callback = key.data
callback(key.fileobj, mask)
if not events:
#events empty means a timeout was reached
sock.sendto(f"{MY_ID} is still here".encode("ascii"), mc_address)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment