0

我可用的 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:in `setsockopt': 地址已经在使用 (Errno::EADDRINUSE) 来自 ./UDPServer.rb:35

所以这就是我所在的地方,并且可以首先使用关于错误的指针(希望通过更新代码),然后一旦我这个示例工作下一步将在混音中添加第二个接口以收听再次多个多播组,

4

1 回答 1

0

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

于 2015-07-01T14:12:38.407 回答