Skip to content

Instantly share code, notes, and snippets.

@tspycher
Last active June 7, 2019 12:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tspycher/d32f8af2a0b6d3deb7d3d51415b8faf5 to your computer and use it in GitHub Desktop.
Save tspycher/d32f8af2a0b6d3deb7d3d51415b8faf5 to your computer and use it in GitHub Desktop.
Example or udp discovery in python
import socket
import time
import uuid
import struct
instance_id = uuid.uuid4().hex
payload = "this is data"
multicast_group = ('224.31.5.85', 19845)
discovery = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
ttl = struct.pack('b', 1)
discovery.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl)
discovery.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
discovery.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
group = socket.inet_aton(multicast_group[0])
mreq = struct.pack('4sL', group, socket.INADDR_ANY)
discovery.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
discovery.settimeout(0.2)
discovery.bind(("", 19845))
while True:
message = "/".join([instance_id, payload]).encode()
# send discovery message
discovery.sendto(message, multicast_group)
# process all other received messages
while True:
try:
data, addr = discovery.recvfrom(1024)
except socket.timeout:
break
else:
rec_instance_id, rec_payload = data.decode().split("/")
if not rec_instance_id == instance_id:
print("received message: {} from {}".format(data, addr))
time.sleep(1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment