web-dev-qa-db-fra.com

Réception de paquets de diffusion en Python

J'ai le code suivant qui envoie un paquet udp qui est diffusé dans le sous-réseau.

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))

Le code suivant sert à recevoir le paquet de diffusion.

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

Le problème est qu'il ne reçoit aucun paquet de diffusion. Cependant, il reçoit avec succès les paquets udp normaux envoyés à ce port.

Ma machine recevait évidemment le paquet de diffusion, que j'ai testé en utilisant netcat.

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

Alors, où est exactement le problème?

18
nitish712

Essayez de lier à l'adresse par défaut:

s.bind(('',12345))
24
John Zwinck

Je pense que la solution décrite dans la réponse acceptée résout le problème, mais pas exactement de la bonne manière. Vous ne devez pas utiliser l'IP d'interface normale, mais l'IP de diffusion utilisée pour envoyer le message. Par exemple, si ifconfig est:





13
Abraham Philip
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]  
2
MinhNV