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