diff options
-rwxr-xr-x | Demo/sockets/mcast.py | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/Demo/sockets/mcast.py b/Demo/sockets/mcast.py new file mode 100755 index 0000000..6dab50a --- /dev/null +++ b/Demo/sockets/mcast.py @@ -0,0 +1,54 @@ +# Send/receive UDP multicast packets (SGI) +# After /usr/people/4Dgifts/examples/network/mcast.c +# Usage: +# mcast -s (sender) +# mcast (receivers) + +MYPORT = 8123 +MYGROUP_BYTES = 225, 0, 0, 250 + +import sys +import time +import struct +from socket import * +from SOCKET import * +from IN import * + +sender = (sys.argv[1:2] == ['-s']) + +s = socket(AF_INET, SOCK_DGRAM) + +if sender: + # Ugly: construct decimal IP address string from MYGROUP_BYTES + mygroup = '' + for byte in MYGROUP_BYTES: mygroup = mygroup + '.' + `byte` + mygroup = mygroup[1:] + ttl = struct.pack('b', 1) # Time-to-live + s.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, ttl) + while 1: + data = `time.time()` + '\n' + s.sendto(data, (mygroup, MYPORT)) + time.sleep(5) +else: + # Bind the socket to my port + s.bind('', MYPORT) + + # Allow multiple copies of this program on one machine + s.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1) # (Not strictly needed) + + # Ugly: construct binary group address from MYGROUP_BYTES + grpaddr = 0 + for byte in MYGROUP_BYTES: grpaddr = (grpaddr << 8) | byte + + # Construct struct mreq from grpaddr and ifaddr + ifaddr = INADDR_ANY + mreq = struct.pack('ll', grpaddr, ifaddr) + + # Add group membership + s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq) + + # Loop, printing any data we receive + while 1: + data, sender = s.recvfrom(1500) + while data[-1:] == '\0': data = data[:-1] # Strip trailing \0's + print sender, ':', `data` |