# 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 = 8123MYGROUP = '225.0.0.250'import sysimport timeimport structfrom socket import *# Main programdef 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 = repr(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, ':', repr(data)# Open a UDP socket, bind it to a port and select a multicast groupdef openmcastsock(group, port): # Import modules used only here import string 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 = map(int, string.split(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', htonl(grpaddr), htonl(ifaddr)) # # Add group membership s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq) # return smain()
# 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
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 = repr(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, ':', repr(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 string
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 = map(int, string.split(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', htonl(grpaddr), htonl(ifaddr))
#
# Add group membership
s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq)
#
return s
main()