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?
Essayez de lier à l'adresse par défaut:
s.bind(('',12345))
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:
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]