blob: c2bcaef43d9d7943bc5c0785a3a0d58e0260bca2 [file] [log] [blame]
Guido van Rossum4fab6a51992-09-08 21:19:55 +00001# Send/receive UDP multicast packets (SGI)
2# After /usr/people/4Dgifts/examples/network/mcast.c
3# Usage:
4# mcast -s (sender)
Guido van Rossumc8833d41992-09-24 10:33:16 +00005# mcast -b (sender, using broadcast instead multicast)
Guido van Rossum4fab6a51992-09-08 21:19:55 +00006# mcast (receivers)
7
8MYPORT = 8123
Guido van Rossum7814c101992-09-24 10:33:40 +00009MYGROUP = '225.0.0.250'
Guido van Rossum4fab6a51992-09-08 21:19:55 +000010
11import sys
12import time
13import struct
Guido van Rossum7814c101992-09-24 10:33:40 +000014import regsub
Guido van Rossum4fab6a51992-09-08 21:19:55 +000015from socket import *
16from SOCKET import *
Guido van Rossum7814c101992-09-24 10:33:40 +000017from IN import * # Local module, SGI specific!!!
Guido van Rossum4fab6a51992-09-08 21:19:55 +000018
Guido van Rossumc8833d41992-09-24 10:33:16 +000019sender = sys.argv[1:]
Guido van Rossum4fab6a51992-09-08 21:19:55 +000020
21s = socket(AF_INET, SOCK_DGRAM)
22
23if sender:
Guido van Rossumc8833d41992-09-24 10:33:16 +000024 if sys.argv[1] == '-b':
25 s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
26 mygroup = '<broadcast>'
27 else:
Guido van Rossum7814c101992-09-24 10:33:40 +000028 mygroup = MYGROUP
Guido van Rossumc8833d41992-09-24 10:33:16 +000029 ttl = struct.pack('b', 1) # Time-to-live
30 s.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, ttl)
Guido van Rossum4fab6a51992-09-08 21:19:55 +000031 while 1:
Guido van Rossumc8833d41992-09-24 10:33:16 +000032 data = `time.time()`
33## data = data + (1400 - len(data)) * '\0'
Guido van Rossum4fab6a51992-09-08 21:19:55 +000034 s.sendto(data, (mygroup, MYPORT))
Guido van Rossumc8833d41992-09-24 10:33:16 +000035 time.sleep(1)
Guido van Rossum4fab6a51992-09-08 21:19:55 +000036else:
Guido van Rossum4fab6a51992-09-08 21:19:55 +000037 # Allow multiple copies of this program on one machine
38 s.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1) # (Not strictly needed)
39
Guido van Rossuma1b51f31992-10-25 19:20:47 +000040 # Bind the socket to my port
41 s.bind('', MYPORT)
42
43 # Construct binary group address from MYGROUP converted to bytes
Guido van Rossum7814c101992-09-24 10:33:40 +000044 bytes = eval(regsub.gsub('\.', ',', MYGROUP))
Guido van Rossum4fab6a51992-09-08 21:19:55 +000045 grpaddr = 0
Guido van Rossum7814c101992-09-24 10:33:40 +000046 for byte in bytes: grpaddr = (grpaddr << 8) | byte
Guido van Rossum4fab6a51992-09-08 21:19:55 +000047
48 # Construct struct mreq from grpaddr and ifaddr
49 ifaddr = INADDR_ANY
50 mreq = struct.pack('ll', grpaddr, ifaddr)
51
52 # Add group membership
53 s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq)
54
55 # Loop, printing any data we receive
56 while 1:
57 data, sender = s.recvfrom(1500)
58 while data[-1:] == '\0': data = data[:-1] # Strip trailing \0's
59 print sender, ':', `data`