Created
June 28, 2021 21:06
-
-
Save dgomes/a44211df24a6c72d7b06565e336e9533 to your computer and use it in GitHub Desktop.
Python3 multicast socket with selectors example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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