我有一台有 2 个接口的计算机,eth0 (192.168.251.10) 和 eth1 (192.168.251.11),我试图让 Ruby 应用程序的两个实例分别监听它们。它们都应该在同一个端口上侦听,只是在不同的接口上。在运行时通过命令行参数指定的接口。
无论我启动应用程序的顺序如何,在 eth0 上监听的总是会成功,但在 eth1 上监听的总是不会收到任何东西。我使用 Wireshark 检查并显示正在接收数据包,但是 Ruby 应用程序没有得到任何东西。
我试过一个非常简单的教科书案例代码,所以我很困惑为什么它不起作用
BasicSocket.do_not_reverse_lookup = true
socket = UDPSocket.new
ip_addr = ARGV[0]
port = 8722
socket.bind(ip_addr, port)
puts "Listener started on #{ip_addr}:#{port}"
while(true)
msg, sender_sockaddr = socket.recvfrom(1024)
end
我在 Ubuntu 12.04 LTS 上运行 Ruby 1.8.7。我注意到的另一件事是,如果我关闭两个接口,然后再次启动,它将在第一个启动的接口上工作,但不是第二个。
netstat 的输出似乎是正确的,显示在两个不同的地址上进行监听。
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 0.0.0.0:68 0.0.0.0:*
udp 0 0 192.168.251.10:8722 0.0.0.0:*
udp 0 0 192.168.251.11:8722 0.0.0.0:*
udp 0 0 0.0.0.0:5353 0.0.0.0:*
udp 0 0 0.0.0.0:54506 0.0.0.0:*
udp6 0 0 :::38033 :::*
udp6 0 0 :::5353 :::*