2014-04-05 30 views
12

Ho il seguente codice che invia un pacchetto udp che viene trasmesso nella subnet.Ricezione di pacchetti broadcast in Python

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

Il seguente codice è per la ricezione del pacchetto broadcast.

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

Il problema è che non riceve alcun pacchetto di trasmissione. Tuttavia, sta ricevendo correttamente i pacchetti udp normali inviati a quella porta.

La mia macchina stava ovviamente ricevendo il pacchetto broadcast, che ho testato usando netcat.

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

Quindi, dove è esattamente il problema?

+0

Si potrebbe voler controllare l'IP perché ho provato il metodo fornito da voi con il mio IP e ha funzionato perfettamente. anche se la risposta data da @John Zwinck funziona bene. – TheCreator232

risposta

19

Prova vincolante per l'indirizzo predefinito:

s.bind(('',12345)) 
+0

Credo, ci deve essere spazio tra le virgolette per farlo funzionare. '''' piuttosto che '''' – TheCreator232

+0

Che ha funzionato davvero! Cosa succede se c'è più di un indirizzo IP per la macchina? – nitish712

+0

@ nitish712: ascolterà tutte le interfacce. –

10

Credo che la soluzione delineata nella risposta accettata risolve il problema, ma non esattamente nel modo giusto. Non si dovrebbe utilizzare l'interfaccia IP normale, ma l'IP broadcast utilizzato per inviare il messaggio. Per esempio, se ifconfig è:


inet addr: 10.0.2.2 Bcast: 10.0.2.255 Mask: 255.255.255.0
allora il server dovrebbe utilizzare s.bind (('10.0.2.255', 12345)), non 10.0. 2.2 (nel caso dell'OP dovrebbe usare 255.255.255.255). Il motivo per cui la risposta accettata funziona è perché "dice al server di accettare pacchetti da tutti gli indirizzi, mentre specificando l'indirizzo IP lo filtra.

"" è il martello, che specifica l'indirizzo di trasmissione corretto è il bisturi. E in molti casi, anche se probabilmente non sono OP, è importante che un server ascolti solo l'indirizzo IP specificato (ad esempio, desideri accettare richieste solo da una rete privata - il codice sopra accetterà le richieste anche da qualsiasi rete esterna), per sicurezza scopi se non altro.

+0

Se si utilizza la trasmissione e non la trasmissione multicast, come si ottengono trasmissioni da qualsiasi cosa diversa da una rete di livello 2 connessa direttamente? A meno che non intenda che vuoi solo ascoltare le trasmissioni su una rete specifica, come una VPN? –

+0

@FilipHaglund finché sei nella stessa rete di livello 3 (subnet) il codice sopra dovrebbe funzionare correttamente. La trasmissione basata su IP è una funzionalità di livello di rete (livello 3), non di livello di collegamento (livello 2). Se si desidera ricevere pacchetti di trasmissione da qualsiasi interfaccia connessa, la risposta accettata dovrebbe essere accettabile. Chiarire la tua domanda potrebbe aiutarmi a risponderti meglio. –

0
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] 
+3

Rispondere solo con il codice non è una buona soluzione. Leggi questo [how-to-ask] (http://stackoverflow.com/help/how-to-ask) per seguire le linee guida SO. – thewaywewere