私が利用できる Ruby バージョンは 1.8.7 であり、現時点ですべての企業の Linux サーバーで使用されている標準イメージの一部であり、これらすべてのサーバーで実行できる必要があるため、アップグレードできません。問題なし(これが問題にならないことを願っています)
私が行っているプロジェクトは、現在 Windows で実行されているアプリケーションを Linux サーバー上で再作成することです。アプリケーションは、マルチキャスト グループとインターフェイスのリストを取得し、グループへの参加を試みます。次に、参加できるかどうか、データがそこにあったかどうかを報告するデータをリッスンします (内容は関係ありません)。サーバーに実際のソフトウェアを展開する前に、環境内でネットワーク接続を証明するのに役立ちます。受信するデータは、取引所からのバイナリ エンコードされた金融情報であるため、出力する必要はありません (したがって、コメント アウトされた行と出力)。
私はオンラインで読んだところ、コードの断片を見つけて、これを小さなバージョンにまとめました。このバージョンでは、1 つのインターフェイスにバインドされた 1 つのマルチキャスト グループに参加し、データが受信されたかどうかを報告する一定期間データをリッスンします。
次に、2 番目のマルチキャスト グループを追加したいと考えましたが、これを実現する方法についての理解が不足しています。私のコードは次のとおりです。
#!/usr/bin/ruby
require 'socket'
require 'ipaddr'
require 'timeout'
MCAST_GROUP_A =
{
:addr => '233.54.12.111',
:port => 26477,
:bindaddr => '172.31.230.156'
}
MCAST_GROUP_B =
{
:addr => '233.54.12.111',
:port => 18170,
:bindaddr => '172.31.230.156'
}
ipA = IPAddr.new(MCAST_GROUP_A[:addr]).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
sockA.setsockopt Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, ipA
sockA.setsockopt Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, ipB
sockA.bind Socket::INADDR_ANY, MCAST_GROUP_A[:port]
sockA.bind Socket::INADDR_ANY, MCAST_GROUP_B[:port]
timeoutSeconds = 10
Timeout.timeout(timeoutSeconds) do
msg, info = sockA.recvfrom(1024)
#puts "MSG: #{msg} from #{info[2]} (#{info[3]})/#{info[1]} len #{msg.size}"
puts "MSG: <garbled> from #{info[2]} (#{info[3]})/#{info[1]} len #{msg.size}"
end
rescue Timeout::Error
puts "Nothing received connection timedout\n"
ensure
sockA.close
end
これを実行すると発生するエラーは次のとおりです。
[root@dt1d-ddncche21a ~]# ./UDPServer.rb ./UDPServer.rb:35:`setsockopt' 内: アドレスは既に使用されています (Errno::EADDRINUSE) from ./UDPServer.rb:35
それが私がいる場所であり、何が間違っているかについての最初のポインターで実際に行うことができます(できればコードを更新することで)。次に、この例が機能したら、次のステップはミックスに2番目のインターフェースを追加して聞くことです。再び複数のマルチキャスト グループ、