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