Changeset 391 for python/trunk/Demo/sockets/mcast.py
- Timestamp:
- Mar 19, 2014, 11:31:01 PM (11 years ago)
- Location:
- python/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
python/trunk
-
Property svn:mergeinfo
set to
/python/vendor/Python-2.7.6 merged eligible /python/vendor/current merged eligible
-
Property svn:mergeinfo
set to
-
python/trunk/Demo/sockets/mcast.py
r2 r391 1 #!/usr/bin/env python 2 # 1 3 # Send/receive UDP multicast packets. 2 4 # Requires that your OS kernel supports IP multicast. 3 # This is built-in on SGI, still optional for most other vendors.4 5 # 5 6 # Usage: 6 # mcast -s (sender) 7 # mcast -b (sender, using broadcast instead multicast) 8 # mcast (receivers) 7 # mcast -s (sender, IPv4) 8 # mcast -s -6 (sender, IPv6) 9 # mcast (receivers, IPv4) 10 # mcast -6 (receivers, IPv6) 9 11 10 12 MYPORT = 8123 11 MYGROUP = '225.0.0.250' 13 MYGROUP_4 = '225.0.0.250' 14 MYGROUP_6 = 'ff15:7079:7468:6f6e:6465:6d6f:6d63:6173' 15 MYTTL = 1 # Increase to reach other networks 12 16 13 import sys14 17 import time 15 18 import struct 16 from socket import * 19 import socket 20 import sys 21 22 def main(): 23 group = MYGROUP_6 if "-6" in sys.argv[1:] else MYGROUP_4 24 25 if "-s" in sys.argv[1:]: 26 sender(group) 27 else: 28 receiver(group) 17 29 18 30 19 # Main program 20 def main(): 21 flags = sys.argv[1:] 22 # 23 if flags: 24 sender(flags[0]) 31 def sender(group): 32 addrinfo = socket.getaddrinfo(group, None)[0] 33 34 s = socket.socket(addrinfo[0], socket.SOCK_DGRAM) 35 36 # Set Time-to-live (optional) 37 ttl_bin = struct.pack('@i', MYTTL) 38 if addrinfo[0] == socket.AF_INET: # IPv4 39 s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl_bin) 25 40 else: 26 receiver()41 s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, ttl_bin) 27 42 28 29 # Sender subroutine (only one per local area network) 30 def sender(flag): 31 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: 43 while True: 40 44 data = repr(time.time()) 41 ## data = data + (1400 - len(data)) * '\0' 42 s.sendto(data, (mygroup, MYPORT)) 45 s.sendto(data + '\0', (addrinfo[4][0], MYPORT)) 43 46 time.sleep(1) 44 47 45 48 46 # Receiver subroutine (as many as you like) 47 def receiver(): 48 # Open and initialize the socket 49 s = openmcastsock(MYGROUP, MYPORT) 50 # 49 def receiver(group): 50 # Look up multicast group address in name server and find out IP version 51 addrinfo = socket.getaddrinfo(group, None)[0] 52 53 # Create a socket 54 s = socket.socket(addrinfo[0], socket.SOCK_DGRAM) 55 56 # Allow multiple copies of this program on one machine 57 # (not strictly needed) 58 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 59 60 # Bind it to the port 61 s.bind(('', MYPORT)) 62 63 group_bin = socket.inet_pton(addrinfo[0], addrinfo[4][0]) 64 # Join group 65 if addrinfo[0] == socket.AF_INET: # IPv4 66 mreq = group_bin + struct.pack('=I', socket.INADDR_ANY) 67 s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) 68 else: 69 mreq = group_bin + struct.pack('@I', 0) 70 s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) 71 51 72 # Loop, printing any data we receive 52 while 1:73 while True: 53 74 data, sender = s.recvfrom(1500) 54 75 while data[-1:] == '\0': data = data[:-1] # Strip trailing \0's 55 print sender, ':', repr(data)76 print (str(sender) + ' ' + repr(data)) 56 77 57 78 58 # Open a UDP socket, bind it to a port and select a multicast group 59 def openmcastsock(group, port): 60 # 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 91 92 93 main() 79 if __name__ == '__main__': 80 main()
Note:
See TracChangeset
for help on using the changeset viewer.