93 lines · 2.3 KB · Python
RawDownload
# 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 = 8123MYGROUP = '225.0.0.250' import sysimport timeimport structfrom socket import *  # Main programdef 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 groupdef 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 = 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()