/Demo/sockets/mcast.py

http://unladen-swallow.googlecode.com/ · Python · 93 lines · 46 code · 12 blank · 35 comment · 8 complexity · 3c013f146fef1548e876ea55ec72e2c9 MD5 · raw file

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