Я рекомендую вам не использовать INADDR_ANY.В производственных многоадресных средах вы хотите быть очень конкретными со своими многоадресными сокетами и не хотите делать что-то вроде отправки igmp, объединяющего все интерфейсы.Это приводит к обходным решениям для хакерских заданий, когда такие вещи не работают, как «route add -host 239.1.1.1 dev eth3», для правильного выполнения многоадресных объединений в зависимости от рассматриваемой системы.Используйте это вместо:
def joinMcast(mcast_addr,port,if_ip):
"""
Returns a live multicast socket
mcast_addr is a dotted string format of the multicast group
port is an integer of the UDP port you want to receive
if_ip is a dotted string format of the interface you will use
"""
#create a UDP socket
mcastsock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#allow other sockets to bind this port too
mcastsock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
#explicitly join the multicast group on the interface specified
mcastsock.setsockopt(socket.SOL_IP,socket.IP_ADD_MEMBERSHIP,
socket.inet_aton(mcast_addr)+socket.inet_aton(if_ip))
#finally bind the socket to start getting data into your socket
mcastsock.bind((mcast_addr,port))
return mcastsock
В mcastsock.bind вы также можете использовать '' вместо строки адреса, но я советую против этого.С '', если у вас есть другой сокет, использующий тот же порт, оба сокета будут получать данные друг друга.