| 
									
										
										
										
											1992-09-08 21:19:55 +00:00
										 |  |  | # Send/receive UDP multicast packets (SGI) | 
					
						
							|  |  |  | # After /usr/people/4Dgifts/examples/network/mcast.c | 
					
						
							|  |  |  | # Usage: | 
					
						
							|  |  |  | #   mcast -s (sender) | 
					
						
							| 
									
										
										
										
											1992-09-24 10:33:16 +00:00
										 |  |  | #   mcast -b (sender, using broadcast instead multicast) | 
					
						
							| 
									
										
										
										
											1992-09-08 21:19:55 +00:00
										 |  |  | #   mcast    (receivers) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MYPORT = 8123 | 
					
						
							| 
									
										
										
										
											1992-09-24 10:33:40 +00:00
										 |  |  | MYGROUP = '225.0.0.250' | 
					
						
							| 
									
										
										
										
											1992-09-08 21:19:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import time | 
					
						
							|  |  |  | import struct | 
					
						
							| 
									
										
										
										
											1992-09-24 10:33:40 +00:00
										 |  |  | import regsub | 
					
						
							| 
									
										
										
										
											1992-09-08 21:19:55 +00:00
										 |  |  | from socket import * | 
					
						
							|  |  |  | from SOCKET import * | 
					
						
							| 
									
										
										
										
											1992-11-16 16:54:45 +00:00
										 |  |  | from IN import *			# SGI specific!!! (Sorry) | 
					
						
							| 
									
										
										
										
											1992-09-08 21:19:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-11-16 16:54:45 +00:00
										 |  |  | # Main program | 
					
						
							|  |  |  | def main(): | 
					
						
							|  |  |  | 	flags = sys.argv[1:] | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	if flags: | 
					
						
							|  |  |  | 		sender(flags[0]) | 
					
						
							|  |  |  | 	else: | 
					
						
							|  |  |  | 		receiver() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-09-08 21:19:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-11-16 16:54:45 +00:00
										 |  |  | # Sender subroutine (only one per local area network) | 
					
						
							|  |  |  | def sender(flag): | 
					
						
							|  |  |  | 	s = socket(AF_INET, SOCK_DGRAM) | 
					
						
							|  |  |  | 	if flag == '-b': | 
					
						
							| 
									
										
										
										
											1992-09-24 10:33:16 +00:00
										 |  |  | 		s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) | 
					
						
							|  |  |  | 		mygroup = '<broadcast>' | 
					
						
							|  |  |  | 	else: | 
					
						
							| 
									
										
										
										
											1992-09-24 10:33:40 +00:00
										 |  |  | 		mygroup = MYGROUP | 
					
						
							| 
									
										
										
										
											1992-09-24 10:33:16 +00:00
										 |  |  | 		ttl = struct.pack('b', 1)		# Time-to-live | 
					
						
							|  |  |  | 		s.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, ttl) | 
					
						
							| 
									
										
										
										
											1992-09-08 21:19:55 +00:00
										 |  |  | 	while 1: | 
					
						
							| 
									
										
										
										
											1992-09-24 10:33:16 +00:00
										 |  |  | 		data = `time.time()` | 
					
						
							|  |  |  | ##		data = data + (1400 - len(data)) * '\0' | 
					
						
							| 
									
										
										
										
											1992-09-08 21:19:55 +00:00
										 |  |  | 		s.sendto(data, (mygroup, MYPORT)) | 
					
						
							| 
									
										
										
										
											1992-09-24 10:33:16 +00:00
										 |  |  | 		time.sleep(1) | 
					
						
							| 
									
										
										
										
											1992-09-08 21:19:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-10-25 19:20:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-11-16 16:54:45 +00:00
										 |  |  | # 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 socket | 
					
						
							|  |  |  | 	import struct | 
					
						
							|  |  |  | 	from SOCKET import * | 
					
						
							|  |  |  | 	from IN import * | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	# Create a socket | 
					
						
							|  |  |  | 	s = socket.socket(AF_INET, SOCK_DGRAM) | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	# Allow multiple copies of this program on one machine | 
					
						
							|  |  |  | 	# (not strictly needed) | 
					
						
							|  |  |  | 	s.setsockopt(SOL_SOCKET, SO_REUSEPORT, 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 = socket.gethostbyname(group) | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	# Construct binary group address | 
					
						
							|  |  |  | 	bytes = eval(regsub.gsub('\.', ',', group)) | 
					
						
							| 
									
										
										
										
											1992-09-08 21:19:55 +00:00
										 |  |  | 	grpaddr = 0 | 
					
						
							| 
									
										
										
										
											1992-09-24 10:33:40 +00:00
										 |  |  | 	for byte in bytes: grpaddr = (grpaddr << 8) | byte | 
					
						
							| 
									
										
										
										
											1992-11-16 16:54:45 +00:00
										 |  |  | 	# | 
					
						
							| 
									
										
										
										
											1992-09-08 21:19:55 +00:00
										 |  |  | 	# Construct struct mreq from grpaddr and ifaddr | 
					
						
							|  |  |  | 	ifaddr = INADDR_ANY | 
					
						
							|  |  |  | 	mreq = struct.pack('ll', grpaddr, ifaddr) | 
					
						
							| 
									
										
										
										
											1992-11-16 16:54:45 +00:00
										 |  |  | 	# | 
					
						
							| 
									
										
										
										
											1992-09-08 21:19:55 +00:00
										 |  |  | 	# Add group membership | 
					
						
							|  |  |  | 	s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq) | 
					
						
							| 
									
										
										
										
											1992-11-16 16:54:45 +00:00
										 |  |  | 	# | 
					
						
							|  |  |  | 	return s | 
					
						
							| 
									
										
										
										
											1992-09-08 21:19:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-11-16 16:54:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | main() |