現在、Ruby 1.8.7 を使用して、ユーザーが構成したマルチキャスト グループとポートに基づいて、最大 2 つのインターフェイスでマルチキャスト データをチェックする Windows ツールの Linux バージョンを開発しています。
複数のマルチキャスト チャネルをリッスンする方法がわからないという以前の問題がありましたが、以前の質問から解決されました。
これが次の問題につながった。複数のマルチキャスト グループをリッスンする必要があります。
特定のグループごとにデータが受信されたかどうかを判断し、データがあるグループとないグループを報告します
すべてのチャネルで同時に、ユーザーが構成可能なタイムアウト期間のデータをリッスンします。
マルチキャスト グループ、ポート、およびインターフェイスがすべてハード コードされている別のコードでこれを機能させようとしています。これを整理して理解したら、ユーザー入力と検証が既に完了しているメイン プログラムに移行します。 . 簡単なプログラム コードを更新したので、次のようになりました。
#!/usr/bin/ruby
require 'socket'
require 'ipaddr'
require 'timeout'
MCAST_GROUP_A
{
:addr1 => '233.54.12.111',
:addr2 => '233.86.230.111',
:port => 26477,
:bindaddr => '172.31.230.156'
}
MCAST_GROUP_B =
{
:addr => '233.54.12.111',
:port => 18170,
:bindaddr => '172.31.230.156'
}
ipA1 = IPAddr.new(MCAST_GROUP_A[:addr1]).hton + IPAddr.new(MCAST_GROUP_A[:bindaddr]).hton
ipA2 = IPAddr.new(MCAST_GROUP_A[:addr2]).hton + IPAddr.new(MCAST_GROUP_A[:bindaddr]).hton
ipB = IPAddr.new(MCAST_GROUP_B[:addr]).hton + IPAddr.new(MCAST_GROUP_B[:bindaddr]).hton
begin
sockA = UDPSocket.open
sockB = UDPSocket.open
sockA.bind Socket::INADDR_ANY, MCAST_GROUP_A[:port]
sockB.bind Socket::INADDR_ANY, MCAST_GROUP_B[:port]
sockA.setsockopt Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, ipA1
sockA.setsockopt Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, ipA2
sockB.setsockopt Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, ipB
timeoutSeconds = 10
Timeout.timeout(timeoutSeconds) do
msg1, info1 = sockA.recvfrom(1024)
msg2, info2 = sockB.recvfrom(1024)
#puts "MSG: #{msg} from #{info[2]} (#{info[3]})/#{info[1]} len #{msg.size}"
puts "MSG: <garbled> from #{info1[2]} (#{info1[3]})/#{info1[1]} len #{msg1.size}"
puts "MSG: <garbled> from #{info2[2]} (#{info2[3]})/#{info2[1]} len #{msg2.size}"
end
rescue Timeout::Error
puts "Nothing received connection timedout\n"
ensure
sockA.close
sockB.close
end
しかし、これにより、B ソケットにデータが存在しないために何も受信されないと報告されるという問題が発生しました。
これの理由は、2 番目の recvfrom がタイムアウトになり、そのためにコードのレスキュー部分になってしまうことだと理解しています。しかし、これは私の最初の Ruby プログラムであり、まだ学習中であるため、解決するために何をすべきかわかりません。
要するに、私は理解する必要があります:
そのソケットには 2 つのマルチキャスト グループがあるため、sockA のどのチャネル データが受信されたかを判断する方法
構成可能な数のデータのマルチキャスト グループを同時に監視し、データの受信に 1 回失敗しても誤ったエラーが出力されないようにする方法