0

私が利用できる 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番目のインターフェースを追加して聞くことです。再び複数のマルチキャスト グループ、

4

1 に答える 1

0

わかりましたので、最初に各ポートのインターフェイスにバインドし、次にリッスンする各マルチキャスト グループのメンバーを追加するというアドバイスに従いました。これにより、この特定の問題が解決され、次の問題に進みました。次回は新たな話題として取り上げます。

于 2015-07-01T14:12:38.407 に答える