0

現在、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 回失敗しても誤ったエラーが出力されないようにする方法

4

1 に答える 1