example - socket timeout python
No se puede asignar la dirección solicitada: Python Multicasting (3)
Acabo de comenzar a trabajar en red y estoy escribiendo un código muy simple para la multidifusión. Todavía no estoy seguro sobre las diferentes interfaces. Algunos ejemplos usaron "0.0.0.0" mientras que otros usaron "127.0.0.1".
Código para el servidor
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()
Código para el cliente
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()
El código del Cliente se ejecuta correctamente y está esperando recibir el mensaje en el socket. Pero el Code Server falla tan pronto como ingreso un mensaje.
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
¿Qué está causando este problema? El código anterior funciona si uso ANY = "0.0.0.0"
. Porqué es eso ? Que cambios ?
Cuando utiliza "0.0.0.0"
o ""
para la creación de redes en python, se abre a cualquier IP entrante. Para su caso, usaría "0.0.0.0"
o "127.0.0.1"
(si no se siente cómodo abriéndose al mundo).
En IPv4, 0.0.0.0 es una dirección especial, también conocida como INADDR_ANY
, que significa "enlazar todas las direcciones posibles en cada interfaz".
Entonces, la red de multidifusión en 224.168.2.9, si es alcanzable, será accesible desde un socket con conexión a 0.0.0.0.
Mientras tanto, 127.0.0.1 es una dirección especial, también INADDR_LOOPBACK
como INADDR_LOOPBACK
, que significa "enlazar localhost solo en el dispositivo loopback". No hay forma de llegar a nada más que al propio host local en ese socket. En particular, no puede comunicarse con su red multicast. Ya sea que obtenga un ENETUNREACH
, ENETDOWN
o EADDRNOTAVAIL
es específico de la plataforma, pero si funciona no lo es, no puede funcionar.
Si desea probar la multidifusión sin realizar pruebas en varios equipos, deberá configurar una red de bucle invertido con más de una dirección, de modo que pueda vincular el cliente, el servidor y el grupo de multidifusión a direcciones diferentes dentro de esa red.
obtener la dirección IP de su dispositivo ubuntu: ifcongfig
elija la dirección IP de cualquier ethernet, loop, wlan, reemplace M_ADDR con esa dirección IP