blob: 8c6298ef4b51b2b9cce630905b4900b60ea7ab04 [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 Rossumbd07b311992-11-16 16:54:45 +000017from IN import * # SGI specific!!! (Sorry)
Guido van Rossum4fab6a51992-09-08 21:19:55 +000018
Guido van Rossum4fab6a51992-09-08 21:19:55 +000019
Guido van Rossumbd07b311992-11-16 16:54:45 +000020# Main program
21def main():
22 flags = sys.argv[1:]
23 #
24 if flags:
25 sender(flags[0])
26 else:
27 receiver()
Guido van Rossum4fab6a51992-09-08 21:19:55 +000028
Guido van Rossumbd07b311992-11-16 16:54:45 +000029
30# Sender subroutine (only one per local area network)
31def sender(flag):
32 s = socket(AF_INET, SOCK_DGRAM)
33 if flag == '-b':
Guido van Rossumc8833d41992-09-24 10:33:16 +000034 s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
35 mygroup = '<broadcast>'
36 else:
Guido van Rossum7814c101992-09-24 10:33:40 +000037 mygroup = MYGROUP
Guido van Rossumc8833d41992-09-24 10:33:16 +000038 ttl = struct.pack('b', 1) # Time-to-live
39 s.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, ttl)
Guido van Rossum4fab6a51992-09-08 21:19:55 +000040 while 1:
Guido van Rossumc8833d41992-09-24 10:33:16 +000041 data = `time.time()`
42## data = data + (1400 - len(data)) * '\0'
Guido van Rossum4fab6a51992-09-08 21:19:55 +000043 s.sendto(data, (mygroup, MYPORT))
Guido van Rossumc8833d41992-09-24 10:33:16 +000044 time.sleep(1)
Guido van Rossum4fab6a51992-09-08 21:19:55 +000045
Guido van Rossuma1b51f31992-10-25 19:20:47 +000046
Guido van Rossumbd07b311992-11-16 16:54:45 +000047# Receiver subroutine (as many as you like)
48def receiver():
49 # Open and initialize the socket
50 s = openmcastsock(MYGROUP, MYPORT)
51 #
Guido van Rossum4fab6a51992-09-08 21:19:55 +000052 # Loop, printing any data we receive
53 while 1:
54 data, sender = s.recvfrom(1500)
55 while data[-1:] == '\0': data = data[:-1] # Strip trailing \0's
56 print sender, ':', `data`
Guido van Rossumbd07b311992-11-16 16:54:45 +000057
58
59# Open a UDP socket, bind it to a port and select a multicast group
60def openmcastsock(group, port):
61 # Import modules used only here
62 import regsub
63 import socket
64 import struct
65 from SOCKET import *
66 from IN import *
67 #
68 # Create a socket
69 s = socket.socket(AF_INET, SOCK_DGRAM)
70 #
71 # Allow multiple copies of this program on one machine
72 # (not strictly needed)
73 s.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1)
74 #
75 # Bind it to the port
Guido van Rossum00d59741994-10-08 19:13:48 +000076 s.bind(('', port))
Guido van Rossumbd07b311992-11-16 16:54:45 +000077 #
78 # Look up multicast group address in name server
79 # (doesn't hurt if it is already in ddd.ddd.ddd.ddd format)
80 group = socket.gethostbyname(group)
81 #
82 # Construct binary group address
83 bytes = eval(regsub.gsub('\.', ',', group))
84 grpaddr = 0
85 for byte in bytes: grpaddr = (grpaddr << 8) | byte
86 #
87 # Construct struct mreq from grpaddr and ifaddr
88 ifaddr = INADDR_ANY
89 mreq = struct.pack('ll', grpaddr, ifaddr)
90 #
91 # Add group membership
92 s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq)
93 #
94 return s
95
96
97main()