# Send/receive UDP multicast packets (SGI) # After /usr/people/4Dgifts/examples/network/mcast.c # Usage: # mcast -s (sender) # mcast -b (sender, using broadcast instead multicast) # mcast (receivers) MYPORT = 8123 MYGROUP_BYTES = 225, 0, 0, 250 import sys import time import struct from socket import * from SOCKET import * from IN import * sender = sys.argv[1:] s = socket(AF_INET, SOCK_DGRAM) if sender: if sys.argv[1] == '-b': s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) mygroup = '' else: # Ugly: construct decimal IP address string from MYGROUP_BYTES mygroup = '' for byte in MYGROUP_BYTES: mygroup = mygroup + '.' + `byte` mygroup = mygroup[1:] ttl = struct.pack('b', 1) # Time-to-live s.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, ttl) while 1: data = `time.time()` ## data = data + (1400 - len(data)) * '\0' s.sendto(data, (mygroup, MYPORT)) time.sleep(1) else: # Bind the socket to my port s.bind('', MYPORT) # Allow multiple copies of this program on one machine s.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1) # (Not strictly needed) # Ugly: construct binary group address from MYGROUP_BYTES grpaddr = 0 for byte in MYGROUP_BYTES: grpaddr = (grpaddr << 8) | byte # Construct struct mreq from grpaddr and ifaddr ifaddr = INADDR_ANY mreq = struct.pack('ll', grpaddr, ifaddr) # Add group membership s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq) # Loop, printing any data we receive while 1: data, sender = s.recvfrom(1500) while data[-1:] == '\0': data = data[:-1] # Strip trailing \0's print sender, ':', `data`