~ubuntu-branches/ubuntu/trusty/python3.4/trusty-proposed

« back to all changes in this revision

Viewing changes to Tools/demo/mcast.py

  • Committer: Package Import Robot
  • Author(s): Matthias Klose
  • Date: 2013-11-25 09:44:27 UTC
  • Revision ID: package-import@ubuntu.com-20131125094427-lzxj8ap5w01lmo7f
Tags: upstream-3.4~b1
ImportĀ upstreamĀ versionĀ 3.4~b1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/env python3
 
2
 
 
3
"""
 
4
Send/receive UDP multicast packets.
 
5
Requires that your OS kernel supports IP multicast.
 
6
 
 
7
Usage:
 
8
  mcast -s (sender, IPv4)
 
9
  mcast -s -6 (sender, IPv6)
 
10
  mcast    (receivers, IPv4)
 
11
  mcast  -6  (receivers, IPv6)
 
12
"""
 
13
 
 
14
MYPORT = 8123
 
15
MYGROUP_4 = '225.0.0.250'
 
16
MYGROUP_6 = 'ff15:7079:7468:6f6e:6465:6d6f:6d63:6173'
 
17
MYTTL = 1 # Increase to reach other networks
 
18
 
 
19
import time
 
20
import struct
 
21
import socket
 
22
import sys
 
23
 
 
24
def main():
 
25
    group = MYGROUP_6 if "-6" in sys.argv[1:] else MYGROUP_4
 
26
 
 
27
    if "-s" in sys.argv[1:]:
 
28
        sender(group)
 
29
    else:
 
30
        receiver(group)
 
31
 
 
32
 
 
33
def sender(group):
 
34
    addrinfo = socket.getaddrinfo(group, None)[0]
 
35
 
 
36
    s = socket.socket(addrinfo[0], socket.SOCK_DGRAM)
 
37
 
 
38
    # Set Time-to-live (optional)
 
39
    ttl_bin = struct.pack('@i', MYTTL)
 
40
    if addrinfo[0] == socket.AF_INET: # IPv4
 
41
        s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl_bin)
 
42
    else:
 
43
        s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, ttl_bin)
 
44
 
 
45
    while True:
 
46
        data = repr(time.time()).encode('utf-8') + b'\0'
 
47
        s.sendto(data, (addrinfo[4][0], MYPORT))
 
48
        time.sleep(1)
 
49
 
 
50
 
 
51
def receiver(group):
 
52
    # Look up multicast group address in name server and find out IP version
 
53
    addrinfo = socket.getaddrinfo(group, None)[0]
 
54
 
 
55
    # Create a socket
 
56
    s = socket.socket(addrinfo[0], socket.SOCK_DGRAM)
 
57
 
 
58
    # Allow multiple copies of this program on one machine
 
59
    # (not strictly needed)
 
60
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
 
61
 
 
62
    # Bind it to the port
 
63
    s.bind(('', MYPORT))
 
64
 
 
65
    group_bin = socket.inet_pton(addrinfo[0], addrinfo[4][0])
 
66
    # Join group
 
67
    if addrinfo[0] == socket.AF_INET: # IPv4
 
68
        mreq = group_bin + struct.pack('=I', socket.INADDR_ANY)
 
69
        s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
 
70
    else:
 
71
        mreq = group_bin + struct.pack('@I', 0)
 
72
        s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq)
 
73
 
 
74
    # Loop, printing any data we receive
 
75
    while True:
 
76
        data, sender = s.recvfrom(1500)
 
77
        while data[-1:] == '\0': data = data[:-1] # Strip trailing \0's
 
78
        print(str(sender) + '  ' + repr(data))
 
79
 
 
80
 
 
81
if __name__ == '__main__':
 
82
    main()