#!/usr/bin/python
#
# Subscribe to multiple multicast channels in python
# If we want to subsribe to channel A:port and B:port
# we first bind to port and then use IP_ADD_MEMBERSHIP 
#


from socket import *
import binascii

interface_ip    = "10.252.4.100"

multicast_port  = 20001
multicast_groupA = "233.252.10.3"
multicast_groupB = "233.252.10.131"


s = socket(AF_INET, SOCK_DGRAM )
s.bind(("" , multicast_port ))
mreqA = inet_aton(multicast_groupA) + inet_aton(interface_ip)
s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, str(mreqA))
mreqB = inet_aton(multicast_groupB) + inet_aton(interface_ip)
s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, str(mreqB))


multicast_port  = 20101
multicast_groupA = "233.252.10.5"
multicast_groupB = "233.252.10.133"


s1 = socket(AF_INET, SOCK_DGRAM )
s1.bind(("" , multicast_port ))
mreqA = inet_aton(multicast_groupA) + inet_aton(interface_ip)
s1.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, str(mreqA))
mreqB = inet_aton(multicast_groupB) + inet_aton(interface_ip)
s1.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, str(mreqB))


multicast_port  = 20201
multicast_groupA = "233.252.10.7"
multicast_groupB = "233.252.10.135"


s2 = socket(AF_INET, SOCK_DGRAM )
s2.bind(("" , multicast_port ))
mreqA = inet_aton(multicast_groupA) + inet_aton(interface_ip)
s2.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, str(mreqA))
mreqB = inet_aton(multicast_groupB) + inet_aton(interface_ip)
s2.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, str(mreqB))

while 1:
      data =  s.recv(1500)
      data1 =  s1.recv(1500)
      data2 =  s2.recv(1500)

      hexdata = binascii.hexlify(data)
      print 'Data = %s' % hexdata
      hexdata1 = binascii.hexlify(data1)
      print 'Data = %s' % hexdata1
      hexdata2 = binascii.hexlify(data2)
      print 'Data = %s' % hexdata2
                              
