具有多个接口(interface)的系统上的 Ruby 套接字绑定(bind)

标签 ruby sockets networking

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

无论我启动应用程序的顺序如何,在 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。我注意到的另一件事是,如果我关闭两个接口(interface),然后再打开,它将在第一个打开的接口(interface)上运行,但不能在第二个上运行。

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                 :::* 

最佳答案

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

关于具有多个接口(interface)的系统上的 Ruby 套接字绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17314564/

相关文章:

sockets - 为远程桌面应用程序选择网络协议(protocol) TCP 还是 UDP?

java - java中httpResponse返回null

ruby-on-rails - Rails 4 : Check if today is sunday, 每月 15 日或最后一天

ruby - 如何在不访问HTTP层的情况下模拟浏览器X509客户端证书验证

javascript - 如何将参数传递给 Rails Controller 方法然后使用 JQuery/AJAX 返回值?

c - 多线程处理http请求时会发生奇怪的事情

c - getaddrinfo 中的 malloc 校验和不正确

java - 客户端(浏览器)在连接到具有 CA 认证证书的 SSLSocket 时超时

networking - 用于实时系统的 TCP

ruby-on-rails - 如何找到 3 个数组的交集,同时忽略空数组?