2

eth0 (192.168.251.10) と eth1 (192.168.251.11) の 2 つのインターフェイスを備えたコンピューターがあり、それぞれで Ruby アプリケーションの 2 つのインスタンスをリッスンしようとしています。どちらも同じポートでリッスンする必要がありますが、異なるインターフェイスでリッスンする必要があります。実行時にコマンド ライン引数を介して指定されたバインド先のインターフェイス。

アプリケーションを起動する順序に関係なく、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 を実行しています。他に気づいたことは、両方のインターフェイスを停止してから再度起動すると、起動された最初のインターフェイスでは動作しますが、2 番目のインターフェイスでは動作しないことです。

netstat からの出力は正しいようで、2 つの異なるアドレスでリッスンしていることを示しています。

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

1 に答える 1