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