2012-10-19 147 views
5

我有一臺Ubuntu虛擬機正在監聽由主機生成的UDP廣播數據包。如果我使用python的socket.bind方法綁定到我的網絡接口eth1或lo(本地環回),我沒有收到任何數據包。但是,如果我使用''(所有接口的符號)綁定,那麼一切都很好。我希望能夠綁定到eth1的地址,但似乎並非如此。有人可以解釋爲什麼''是必需的嗎?有什麼奇怪的事情發生,因爲我正在使用虛擬機?我正在使用橋接網絡設置,因此虛擬機看起來像我局域網中的另一臺計算機。下面的代碼:接收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

'127.0.0.1'呢? – dav1d

+0

127.0.0.1也不起作用。出於某種原因,它必須是我不明白的地址。我會更改我的代碼以使其更清晰一些。 – user975326

回答

0

在網絡編程中空地址字符串表示所有配置的接口。但是,如果指定了IP地址,則套接字將只在具有指定IP地址的接口上偵聽。

0

還有綁定到廣播地址(根據http://docs.python.org/2/library/socket.html)選項「<廣播>」。所以我建議你嘗試使用你的接口的廣播地址,比如192.168.2.255(假設你的網絡是192.168.2.0/24)。