具有多个接口的系统上的Ruby套接字绑定

时间:2013-06-26 07:57:37

标签: ruby sockets networking

我有一台带有2个接口的计算机,eth0(192.168.251.10)和eth1(192.168.251.11),我正试图让两个Ruby应用程序实例监听它们。他们应该只在不同的接口上监听同一个端口。在运行期间通过命令行args绑定到指定的接口。

无论我启动应用程序的顺序如何,监听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                 :::* 

1 个答案:

答案 0 :(得分:0)

这不是设置应用的标准方法。不建议使用硬编码网络分配。您最好使用负载均衡器并让它处理接口分配。