2012-10-19 12 views
5

Mam urządzenie wirtualne Ubuntu nasłuchujące pakietów rozgłaszania UDP, które są generowane przez maszynę hosta. Jeśli połączę się z jednym z moich interfejsów sieciowych eth1 lub lo (local loopback) przy użyciu metody socket.bind Pythona, nie otrzymuję żadnych pakietów. Jeśli jednak wiążę za pomocą "" (symbol dla wszystkich interfejsów), wszystko jest w porządku. Spodziewałbym się, że można powiązać tylko adres eth1, ale nie wydaje się, żeby tak było. Czy ktoś mógłby wyjaśnić, dlaczego "" jest wymagany? Czy jest coś ciekawego, ponieważ korzystam z wirtualnej maszyny? Używam konfiguracji sieci zmostkowanej, więc maszyna wirtualna wygląda jak inna maszyna w mojej sieci LAN. Oto kod:Odbieranie transmisji 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

co z '127.0.0.1'? – dav1d

+0

127.0.0.1 również nie działa. Z jakiegoś powodu musi to być adres, którego nie rozumiem. Zmienię swój kod, żeby był nieco jaśniejszy. – user975326

Odpowiedz

0

W programowaniu sieci pusty ciąg adresu oznacza wszystkie skonfigurowane interfejsy. Jeśli jednak podany jest adres IP, gniazdo będzie nasłuchiwać tylko w interfejsie o określonym adresie IP.

0

Istnieje również opcja „<broadcast>” wiążą się adres broadcast (według http://docs.python.org/2/library/socket.html). Sugeruję więc, abyś spróbował użyć adresu rozgłoszeniowego interfejsu, np. 192.168.2.255 (zakładając, że twoja sieć ma 192.168.2.0/24).

Powiązane problemy