2012-10-19 111 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)。