Recibiendo paquetes de transmisión en Python

Tengo el siguiente código que envía un paquete udp que se transmite en la subred.

 from socket import * s=socket(AF_INET, SOCK_DGRAM) s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) s.sendto('this is testing',('255.255.255.255',12345)) 

El siguiente código es para recibir el paquete de difusión.

 from socket import * s=socket(AF_INET, SOCK_DGRAM) s.bind(('172.30.102.141',12345)) m=s.recvfrom(1024) print m[0] 

El problema es que no está recibiendo ningún paquete de difusión. Sin embargo, está recibiendo con éxito los paquetes udp normales enviados a ese puerto.

Mi máquina obviamente estaba recibiendo el paquete de transmisión, que probé utilizando netcat .

 $ netcat -lu -p 12345 this is testing^C 

Entonces, ¿dónde está exactamente el problema?

Intente enlazar a la dirección predeterminada:

 s.bind(('',12345)) 

Creo que la solución descrita en la respuesta aceptada resuelve el problema, pero no de la manera correcta. No debe utilizar la interfaz IP normal, sino la IP de difusión que se utiliza para enviar el mensaje. Por ejemplo si ifconfig es:


inet addr: 10.0.2.2 Bcast: 10.0.2.255 Máscara: 255.255.255.0


entonces el servidor debe usar s.bind ((‘10.0.2.255’, 12345)), no 10.0.2.2 (en el caso de OP, debe usar 255.255.255.255). La razón por la que la respuesta aceptada funciona es porque “” le dice al servidor que acepte paquetes de todas las direcciones, mientras especifica la dirección IP, la filtra.

” es el martillo, especificando la dirección de transmisión correcta es el escalpelo. Y en muchos casos, aunque posiblemente no sean OP, es importante que un servidor escuche solo la dirección IP especificada (por ejemplo, desea aceptar solicitudes solo de una red privada; el código anterior también aceptaría solicitudes de cualquier red externa), por seguridad Propósitos si nada más.

 s=socket(AF_INET, SOCK_DGRAM) s.bind(('',1234)) while(1): m=s.recvfrom(4096) print 'len(m)='+str(len(m)) print 'len(m[0])='+str(len(m[0])) print m[0] print 'len(m[1])='+str(len(m[1])) print m[1]