我可用的Ruby版本是1.8.7并且无法升级,因为它是目前所有公司Linux服务器上使用的标准映像的一部分,我所做的任何事情都需要能够在所有Linux服务器上运行这些服务器没有问题(我希望这不会是一个问题)
我正在做的项目是重新创建一个当前在Linux服务器上运行的应用程序。应用程序获取多播组和接口的列表,并尝试加入组,然后侦听报告是否可以加入并且数据存在的任何数据(无关紧要)。在将实际软件部署到服务器之前,它可以帮助我们的环境证明网络连接。它将接收的数据将是来自交换机的二进制编码财务信息,因此我不需要输出(因此注释掉的行和输出)我只需要检查它是否可供服务器使用。
我已经在线阅读,发现我拼凑在一起的一小段代码到一个小版本,它加入了绑定到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~]#。/ UDPerver.rb ./UDPServer.rb:35:in`setsockopt':地址已在使用中(Errno :: EADDRINUSE) 来自./UDPServer.rb:35
这就是我所处的地方,并且可以真正做到第一个指针指出什么是错误的(希望更新代码)然后一旦我这个例子工作下一步将添加第二个接口到混合再次收听多个组播组,
答案 0 :(得分:0)
好的,所以我按照给出的建议首先绑定到每个端口的接口,然后为我想听的每个组播组添加成员,这解决了这个特定的问题并让我转到下一个问题我有。我将提出下一个问题作为一个新主题。