Ne peut pas affecter une adresse demandée : Python Multidiffusion

J'ai commencé avec mise en réseau et suis en train d'écrire un code très simple pour la multidiffusion. Je ne suis pas encore sûr sur les différentes interfaces. Quelques exemples utilisés "0.0.0.0", tandis que d'autres ont utilisé des "127.0.0.1".

Code pour le Serveur

import socket
import sys
import time

ANY = socket.gethostbyname('localhost')
S_PORT = 1501
M_ADDR = "224.168.2.9"
M_PORT = 1600

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEPORT,1)
sock.bind((ANY,S_PORT))
sock.setsockopt(socket.IPPROTO_IP,socket.IP_MULTICAST_TTL,255)

while 1:
    message = raw_input("Enter message: ")
    sock.sendto(message,(M_ADDR,M_PORT))
    if message == "exit":
        break
sock.close()

Code Client

import socket
import time
import sys

ANY = socket.gethostbyname('localhost')
M_ADDR = "224.168.2.9"
M_PORT = 1600
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEPORT,1)
sock.bind((ANY,M_PORT))
sock.setsockopt(socket.IPPROTO_IP,socket.IP_MULTICAST_TTL,255)
status = sock.setsockopt(socket.IPPROTO_IP,socket.IP_ADD_MEMBERSHIP,socket.inet_aton(M_ADDR) + socket.inet_aton(ANY))

while 1:
    data,addr = sock.recvfrom(1024)
    print "Received message from " + str(addr) + " : " + data
    if data == "exit":
        break
sock.close()

Le code Client fonctionne correctement et est en attente de recevoir un message sur le socket. Mais le Code du Serveur se bloque dès que je rentre n'importe quel message.

Traceback (most recent call last):
  File "multicast_server.py", line 17, in <module>
    sock.sendto(message,(M_ADDR,M_PORT))
socket.error: [Errno 49] Can't assign requested address

Quelle est l'origine de ce problème ?
Le code ci-dessus fonctionne si j'utilise ANY = "0.0.0.0". Pourquoi est-ce ? Quels sont les changements ?

Êtes-vous sûr que vous avez voulu SO_REUSEPORT mais pas SO_REUSEADDR ici? (Cette réponse explique ce qu'ils signifient, sur chaque plate-forme.)
Oui, j'utilise un MAC OSX qui nécessite SO_REUSEPORT. Le lien est utile, comme je l'ai été confondu pourquoi la différence!

OriginalL'auteur Kyuubi | 2013-11-05