1 # Send/receive UDP multicast packets.
2 # Requires that your OS kernel supports IP multicast.
3 # This is built-in on SGI, still optional for most other vendors.
7 # mcast -b (sender, using broadcast instead multicast)
11 MYGROUP
= '225.0.0.250'
30 # Sender subroutine (only one per local area network)
32 s
= socket(AF_INET
, SOCK_DGRAM
)
34 s
.setsockopt(SOL_SOCKET
, SO_BROADCAST
, 1)
35 mygroup
= '<broadcast>'
38 ttl
= struct
.pack('b', 1) # Time-to-live
39 s
.setsockopt(IPPROTO_IP
, IP_MULTICAST_TTL
, ttl
)
42 ## data = data + (1400 - len(data)) * '\0'
43 s
.sendto(data
, (mygroup
, MYPORT
))
47 # Receiver subroutine (as many as you like)
49 # Open and initialize the socket
50 s
= openmcastsock(MYGROUP
, MYPORT
)
52 # Loop, printing any data we receive
54 data
, sender
= s
.recvfrom(1500)
55 while data
[-1:] == '\0': data
= data
[:-1] # Strip trailing \0's
56 print sender
, ':', `data`
59 # Open a UDP socket, bind it to a port and select a multicast group
60 def openmcastsock(group
, port
):
61 # Import modules used only here
66 s
= socket(AF_INET
, SOCK_DGRAM
)
68 # Allow multiple copies of this program on one machine
69 # (not strictly needed)
70 s
.setsockopt(SOL_SOCKET
, SO_REUSEADDR
, 1)
75 # Look up multicast group address in name server
76 # (doesn't hurt if it is already in ddd.ddd.ddd.ddd format)
77 group
= gethostbyname(group
)
79 # Construct binary group address
80 bytes
= eval(regsub
.gsub('\.', ',', group
))
82 for byte
in bytes
: grpaddr
= (grpaddr
<< 8) | byte
84 # Construct struct mreq from grpaddr and ifaddr
86 mreq
= struct
.pack('ll', grpaddr
, ifaddr
)
88 # Add group membership
89 s
.setsockopt(IPPROTO_IP
, IP_ADD_MEMBERSHIP
, mreq
)