2012-10-19 17 views
5

Possiedo una macchina virtuale Ubuntu che ascolta i pacchetti broadcast UDP generati dalla macchina host. Se eseguo il binding a una delle mie interfacce di rete eth1 o lo (loopback locale) utilizzando il metodo socket.bind di python, non ricevo alcun pacchetto. Se, tuttavia, lego usando '' (il simbolo per tutte le interfacce) allora tutto va bene. Mi aspetterei che fosse possibile associare solo l'indirizzo di eth1, ma questo non sembra essere il caso. Qualcuno potrebbe spiegare perché è richiesto "? C'è qualcosa di funky in corso perché sto usando una macchina virtuale? Uso una configurazione di rete a ponte in modo che la macchina virtuale assomigli a un'altra macchina sulla mia LAN. Ecco il codice:Ricezione trasmissione UDP [VirtualBox, Ubuntu, Python]

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 

sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) 

# using the '' address works 
sock.bind(('', UDP_PORT)) 
# using the address of eth1 doesn't 
#sock.bind(('192.168.2.123', UDP_PORT)) 
# and neither does using the local loopback 
#sock.bind(('127.0.0.1', UDP_PORT)) 

while True: 
    data, addr = sock.recv(2048) 
    print data 
+0

che dire di '127.0.0.1'? – dav1d

+0

127.0.0.1 non funziona neanche. Per qualche ragione deve essere l'indirizzo che è quello che non capisco. Cambierò il mio codice per essere un po 'più chiaro. – user975326

risposta

0

Nella programmazione di rete la stringa di indirizzo vuota indica tutte le interfacce configurate. Se tuttavia viene specificato l'indirizzo IP, il socket ascolterà solo sull'interfaccia con l'indirizzo IP specificato.

0

C'è anche l'opzione '<trasmissione>' di legarsi a un indirizzo broadcast (secondo http://docs.python.org/2/library/socket.html). Quindi ti suggerisco di provare a usare l'indirizzo di broadcast della tua interfaccia, come 192.168.2.255 (supponendo che la tua rete sia 192.168.2.0/24).

Problemi correlati