- Got rid of newmodule.c
[python/dscho.git] / Demo / sockets / mcast.py
blobcc7a7e07d447c7b1465fa1492a8e6fac91d39c64
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.
5 # Usage:
6 # mcast -s (sender)
7 # mcast -b (sender, using broadcast instead multicast)
8 # mcast (receivers)
10 MYPORT = 8123
11 MYGROUP = '225.0.0.250'
13 import sys
14 import time
15 import struct
16 import regsub
17 from socket import *
20 # Main program
21 def main():
22 flags = sys.argv[1:]
24 if flags:
25 sender(flags[0])
26 else:
27 receiver()
30 # Sender subroutine (only one per local area network)
31 def sender(flag):
32 s = socket(AF_INET, SOCK_DGRAM)
33 if flag == '-b':
34 s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
35 mygroup = '<broadcast>'
36 else:
37 mygroup = MYGROUP
38 ttl = struct.pack('b', 1) # Time-to-live
39 s.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, ttl)
40 while 1:
41 data = `time.time()`
42 ## data = data + (1400 - len(data)) * '\0'
43 s.sendto(data, (mygroup, MYPORT))
44 time.sleep(1)
47 # Receiver subroutine (as many as you like)
48 def receiver():
49 # Open and initialize the socket
50 s = openmcastsock(MYGROUP, MYPORT)
52 # 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`
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
62 import string
63 import struct
65 # Create a socket
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)
72 # Bind it to the port
73 s.bind(('', port))
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 = map(int, string.split(group, "."))
81 grpaddr = 0
82 for byte in bytes: grpaddr = (grpaddr << 8) | byte
84 # Construct struct mreq from grpaddr and ifaddr
85 ifaddr = INADDR_ANY
86 mreq = struct.pack('ll', htonl(grpaddr), htonl(ifaddr))
88 # Add group membership
89 s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq)
91 return s
94 main()