我可用的Ruby版本是1.8.7,无法升级,因为它是目前在所有公司Linux服务器上使用的标准映像的一部分,而我所做的一切都需要能够在所有这些服务器上运行没有问题(我希望这不会成为问题)

我正在做的项目是在Linux服务器上的Windows上重新创建当前运行的应用程序。该应用程序获取多播组和接口的列表,并尝试加入这些组,然后侦听任何数据(无关紧要),报告是否可以加入并且数据在那里。它可以帮助我们在环境中在将实际软件部署到服务器上之前证明网络连接性。它将接收的数据将是来自交易所的二进制编码的财务信息,因此我不需要输出(因此注释行和输出),我只需要检查服务器是否可用即可。

我已经在线阅读了一些代码,并将它们拼凑成一个小版本,在其中加入了绑定到1个接口的1个多播组,并在一段时间内监听数据,报告是否接收到任何数据。

然后,我想添加第二个多播组,而这正是我对此缺乏了解的地方。我的代码如下:

#!/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)
          来自./UDPServer.rb:35


因此,这就是我所处的位置,并且可以真正地首先处理出现错误的指针(希望对代码进行更新),然后一旦完成本示例的工作,下一步便是在混音中添加第二个接口以侦听再次有多个多播组,

最佳答案

好的,所以我遵循了给出的建议,即首先为每个端口绑定到接口,然后为我想收听的每个多播组添加成员,这已经解决了这个特定问题,并将我转移到下一个问题上。下一个问题将作为新话题提出。

08-05 10:21