mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			94 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
# 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 = '<broadcast>'
 | 
						|
	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_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 = 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()
 |