home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / pyth_os2.zip / python-1.0.2 / Demo / sockets / mcast.py < prev    next >
Text File  |  1992-11-16  |  2KB  |  98 lines

  1. # Send/receive UDP multicast packets (SGI)
  2. # After /usr/people/4Dgifts/examples/network/mcast.c
  3. # Usage:
  4. #   mcast -s (sender)
  5. #   mcast -b (sender, using broadcast instead multicast)
  6. #   mcast    (receivers)
  7.  
  8. MYPORT = 8123
  9. MYGROUP = '225.0.0.250'
  10.  
  11. import sys
  12. import time
  13. import struct
  14. import regsub
  15. from socket import *
  16. from SOCKET import *
  17. from IN import *            # SGI specific!!! (Sorry)
  18.  
  19.  
  20. # Main program
  21. def main():
  22.     flags = sys.argv[1:]
  23.     #
  24.     if flags:
  25.         sender(flags[0])
  26.     else:
  27.         receiver()
  28.  
  29.  
  30. # Sender subroutine (only one per local area network)
  31. def sender(flag):
  32.     s = socket(AF_INET, SOCK_DGRAM)
  33.     if flag == '-b':
  34.         s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
  35.         mygroup = '<broadcast>'
  36.     else:
  37.         mygroup = MYGROUP
  38.         ttl = struct.pack('b', 1)        # Time-to-live
  39.         s.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, ttl)
  40.     while 1:
  41.         data = `time.time()`
  42. ##        data = data + (1400 - len(data)) * '\0'
  43.         s.sendto(data, (mygroup, MYPORT))
  44.         time.sleep(1)
  45.  
  46.  
  47. # Receiver subroutine (as many as you like)
  48. def receiver():
  49.     # Open and initialize the socket
  50.     s = openmcastsock(MYGROUP, MYPORT)
  51.     #
  52.     # Loop, printing any data we receive
  53.     while 1:
  54.         data, sender = s.recvfrom(1500)
  55.         while data[-1:] == '\0': data = data[:-1] # Strip trailing \0's
  56.         print sender, ':', `data`
  57.  
  58.  
  59. # Open a UDP socket, bind it to a port and select a multicast group
  60. def openmcastsock(group, port):
  61.     # Import modules used only here
  62.     import regsub
  63.     import socket
  64.     import struct
  65.     from SOCKET import *
  66.     from IN import *
  67.     #
  68.     # Create a socket
  69.     s = socket.socket(AF_INET, SOCK_DGRAM)
  70.     #
  71.     # Allow multiple copies of this program on one machine
  72.     # (not strictly needed)
  73.     s.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1)
  74.     #
  75.     # Bind it to the port
  76.     s.bind('', port)
  77.     #
  78.     # Look up multicast group address in name server
  79.     # (doesn't hurt if it is already in ddd.ddd.ddd.ddd format)
  80.     group = socket.gethostbyname(group)
  81.     #
  82.     # Construct binary group address
  83.     bytes = eval(regsub.gsub('\.', ',', group))
  84.     grpaddr = 0
  85.     for byte in bytes: grpaddr = (grpaddr << 8) | byte
  86.     #
  87.     # Construct struct mreq from grpaddr and ifaddr
  88.     ifaddr = INADDR_ANY
  89.     mreq = struct.pack('ll', grpaddr, ifaddr)
  90.     #
  91.     # Add group membership
  92.     s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq)
  93.     #
  94.     return s
  95.  
  96.  
  97. main()
  98.