2012-10-19 7 views
5

Ich habe eine Ubuntu Virtual Machine, die UDP-Broadcast-Pakete abhört, die vom Host-Rechner generiert werden. Wenn ich mit der Methode socket.bind von python an eine meiner Netzwerkschnittstellen eth1 oder lo (local loopback) binde, erhalte ich keine Pakete. Wenn ich jedoch mit '' (das Symbol für alle Schnittstellen) binde, ist alles in Ordnung. Ich würde erwarten, dass es möglich ist, nur an die Adresse von eth1 zu binden, aber das scheint nicht der Fall zu sein. Könnte jemand erklären, warum das '' benötigt wird? Gibt es etwas Unkonventionelles, weil ich eine virtuelle Maschine benutze? Ich verwende ein Bridged-Netzwerk-Setup, sodass die virtuelle Maschine wie eine andere Maschine in meinem LAN aussieht. Hier ist der Code:Empfangen von UDP-Broadcast [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

was ist '127.0.0.1'? – dav1d

+0

127.0.0.1 funktioniert auch nicht. Aus irgendeinem Grund muss es die Adresse sein, die ich nicht verstehe. Ich werde meinen Code ändern, um ein bisschen klarer zu sein. – user975326

Antwort

0

In der Netzwerkprogrammierung bezeichnet leere Adressfolge alle konfigurierten Schnittstellen. Wenn jedoch die IP-Adresse angegeben ist, wird der Socket nur die Schnittstelle mit der angegebenen IP-Adresse abhören.

0

Es gibt auch die Option '<Sendung>' an eine Broadcast-Adresse zu binden (nach http://docs.python.org/2/library/socket.html). Daher würde ich vorschlagen, dass Sie versuchen, die Broadcast-Adresse Ihrer Schnittstelle zu verwenden, wie 192.168.2.255 (vorausgesetzt, Ihr Netzwerk ist 192.168.2.0/24).