socket example conexion python networking udp multicast

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