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
Oui, j'utilise un MAC OSX qui nécessite
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
Vous devez vous connecter pour publier un commentaire.
En IPv4, 0.0.0.0 est une adresse spéciale, aka
INADDR_ANY
, qui signifie "lier chaque adresse sur chaque interface".Donc, la multidiffusion de réseau à 224.168.2.9, si c'est accessible à tous, sera certainement accessible à partir d'une prise lié à 0.0.0.0.
Pendant ce temps, l'adresse 127.0.0.1 est une adresse spéciale, aka
INADDR_LOOPBACK
, qui signifie "lier localhost uniquement sur le périphérique loopback". Il n'y a aucun moyen d'atteindre quelque chose, mais l'hôte local lui-même sur ce socket. En particulier, vous ne pouvez pas joindre votre réseau de multidiffusion. Si vous recevez unENETUNREACH
,ENETDOWN
, ouEADDRNOTAVAIL
est une plate-forme spécifique, mais si ça marche, c'est pas qu'il ne peut pas travailler.Si vous voulez tester la multidiffusion sans test sur plusieurs ordinateurs, vous aurez besoin de mettre en place un réseau de bouclage avec plus d'une adresse, de sorte que vous pouvez lier le client, le serveur et le groupe de multidiffusion de tous à des adresses différentes au sein de ce réseau.
OriginalL'auteur abarnert
Lorsque vous utilisez
"0.0.0.0"
ou""
pour la mise en réseau en python, il s'ouvre à tout IP entrantes. Pour votre cas, je voudrais utiliser"0.0.0.0"
ou"127.0.0.1"
(si vous n'êtes pas à l'aise de l'ouverture au monde.)OriginalL'auteur andrewgrz
obtenir votre adresse ip de l'appareil
ubuntu: ifcongfig
choisir l'adresse ip ethernet ,boucle, wlan
remplacer M_ADDR avec cette adresse ip
OriginalL'auteur user6475064