| # Send/receive UDP multicast packets. |
| # Requires that your OS kernel supports IP multicast. |
| # This is built-in on SGI, still optional for most other vendors. |
| # |
| # Usage: |
| # mcast -s (sender) |
| # mcast -b (sender, using broadcast instead multicast) |
| # mcast (receivers) |
| |
| MYPORT = 8123 |
| MYGROUP = '225.0.0.250' |
| |
| import sys |
| import time |
| import struct |
| from socket import * |
| |
| |
| # Main program |
| def main(): |
| flags = sys.argv[1:] |
| # |
| if flags: |
| sender(flags[0]) |
| else: |
| receiver() |
| |
| |
| # Sender subroutine (only one per local area network) |
| def sender(flag): |
| s = socket(AF_INET, SOCK_DGRAM) |
| if flag == '-b': |
| s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) |
| mygroup = '<broadcast>' |
| else: |
| mygroup = MYGROUP |
| ttl = struct.pack('b', 1) # Time-to-live |
| s.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, ttl) |
| while 1: |
| data = repr(time.time()) |
| ## data = data + (1400 - len(data)) * '\0' |
| s.sendto(data, (mygroup, MYPORT)) |
| time.sleep(1) |
| |
| |
| # Receiver subroutine (as many as you like) |
| def receiver(): |
| # Open and initialize the socket |
| s = openmcastsock(MYGROUP, MYPORT) |
| # |
| # 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, ':', repr(data)) |
| |
| |
| # Open a UDP socket, bind it to a port and select a multicast group |
| def openmcastsock(group, port): |
| # Import modules used only here |
| import string |
| import struct |
| # |
| # Create a socket |
| s = socket(AF_INET, SOCK_DGRAM) |
| # |
| # Allow multiple copies of this program on one machine |
| # (not strictly needed) |
| s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) |
| # |
| # Bind it to the port |
| s.bind(('', port)) |
| # |
| # Look up multicast group address in name server |
| # (doesn't hurt if it is already in ddd.ddd.ddd.ddd format) |
| group = gethostbyname(group) |
| # |
| # Construct binary group address |
| bytes = list(map(int, string.split(group, "."))) |
| grpaddr = 0 |
| for byte in bytes: grpaddr = (grpaddr << 8) | byte |
| # |
| # Construct struct mreq from grpaddr and ifaddr |
| ifaddr = INADDR_ANY |
| mreq = struct.pack('ll', htonl(grpaddr), htonl(ifaddr)) |
| # |
| # Add group membership |
| s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq) |
| # |
| return s |
| |
| |
| main() |