blob: 1abd30563290016ce121f9e1d46da72a9c3e2dfa [file] [log] [blame]
Guido van Rossum50d5e8a1995-03-04 22:57:56 +00001# 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.
4#
Guido van Rossum4fab6a51992-09-08 21:19:55 +00005# Usage:
6# mcast -s (sender)
Guido van Rossumc8833d41992-09-24 10:33:16 +00007# mcast -b (sender, using broadcast instead multicast)
Guido van Rossum4fab6a51992-09-08 21:19:55 +00008# mcast (receivers)
9
10MYPORT = 8123
Guido van Rossum7814c101992-09-24 10:33:40 +000011MYGROUP = '225.0.0.250'
Guido van Rossum4fab6a51992-09-08 21:19:55 +000012
13import sys
14import time
15import struct
16from socket import *
Guido van Rossum4fab6a51992-09-08 21:19:55 +000017
Guido van Rossum4fab6a51992-09-08 21:19:55 +000018
Guido van Rossumbd07b311992-11-16 16:54:45 +000019# Main program
20def main():
Tim Peterse6ddc8b2004-07-18 05:56:09 +000021 flags = sys.argv[1:]
22 #
23 if flags:
24 sender(flags[0])
25 else:
26 receiver()
Guido van Rossum4fab6a51992-09-08 21:19:55 +000027
Guido van Rossumbd07b311992-11-16 16:54:45 +000028
29# Sender subroutine (only one per local area network)
30def sender(flag):
Tim Peterse6ddc8b2004-07-18 05:56:09 +000031 s = socket(AF_INET, SOCK_DGRAM)
32 if flag == '-b':
33 s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
34 mygroup = '<broadcast>'
35 else:
36 mygroup = MYGROUP
37 ttl = struct.pack('b', 1) # Time-to-live
38 s.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, ttl)
39 while 1:
40 data = repr(time.time())
41## data = data + (1400 - len(data)) * '\0'
42 s.sendto(data, (mygroup, MYPORT))
43 time.sleep(1)
Guido van Rossum4fab6a51992-09-08 21:19:55 +000044
Guido van Rossuma1b51f31992-10-25 19:20:47 +000045
Guido van Rossumbd07b311992-11-16 16:54:45 +000046# Receiver subroutine (as many as you like)
47def receiver():
Tim Peterse6ddc8b2004-07-18 05:56:09 +000048 # Open and initialize the socket
49 s = openmcastsock(MYGROUP, MYPORT)
50 #
51 # Loop, printing any data we receive
52 while 1:
53 data, sender = s.recvfrom(1500)
54 while data[-1:] == '\0': data = data[:-1] # Strip trailing \0's
55 print sender, ':', repr(data)
Guido van Rossumbd07b311992-11-16 16:54:45 +000056
57
58# Open a UDP socket, bind it to a port and select a multicast group
59def openmcastsock(group, port):
Tim Peterse6ddc8b2004-07-18 05:56:09 +000060 # Import modules used only here
61 import string
62 import struct
63 #
64 # Create a socket
65 s = socket(AF_INET, SOCK_DGRAM)
66 #
67 # Allow multiple copies of this program on one machine
68 # (not strictly needed)
69 s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
70 #
71 # Bind it to the port
72 s.bind(('', port))
73 #
74 # Look up multicast group address in name server
75 # (doesn't hurt if it is already in ddd.ddd.ddd.ddd format)
76 group = gethostbyname(group)
77 #
78 # Construct binary group address
79 bytes = map(int, string.split(group, "."))
80 grpaddr = 0
81 for byte in bytes: grpaddr = (grpaddr << 8) | byte
82 #
83 # Construct struct mreq from grpaddr and ifaddr
84 ifaddr = INADDR_ANY
85 mreq = struct.pack('ll', htonl(grpaddr), htonl(ifaddr))
86 #
87 # Add group membership
88 s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq)
89 #
90 return s
Guido van Rossumbd07b311992-11-16 16:54:45 +000091
92
93main()