# Send/receive UDP multicast packets. # Requires that your OS kernel supports IP multicast. # This is built-in on SGI, still optional for most other vendors. # # Usage: # mcast -s (sender) # mcast -b (sender, using broadcast instead multicast) # mcast (receivers) MYPORT = 8123 MYGROUP = '225.0.0.250' import sys import time import struct import regsub from socket import * # Main program def main(): flags = sys.argv[1:] # if flags: sender(flags[0]) else: receiver() # Sender subroutine (only one per local area network) def sender(flag): s = socket(AF_INET, SOCK_DGRAM) if flag == '-b': s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) mygroup = '' else: mygroup = MYGROUP 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) # Receiver subroutine (as many as you like) def receiver(): # Open and initialize the socket s = openmcastsock(MYGROUP, MYPORT) # # 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` # Open a UDP socket, bind it to a port and select a multicast group def openmcastsock(group, port): # Import modules used only here import regsub import struct # # Create a socket s = socket(AF_INET, SOCK_DGRAM) # # Allow multiple copies of this program on one machine # (not strictly needed) s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) # # Bind it to the port s.bind(('', port)) # # Look up multicast group address in name server # (doesn't hurt if it is already in ddd.ddd.ddd.ddd format) group = gethostbyname(group) # # Construct binary group address bytes = eval(regsub.gsub('\.', ',', group)) grpaddr = 0 for byte in 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) # return s main()