Ruby 如何同时监视多个多播组

Ruby 如何同时监视多个多播组,ruby,linux,udp,multicast,multicastsocket,Ruby,Linux,Udp,Multicast,Multicastsocket,我目前正在使用Ruby 1.8.7开发Windows工具的Linux版本,该工具基于用户配置的多播组和端口在多达2个接口上检查多播数据 我有一个以前的问题,我不知道如何收听多个多播频道,但这已经从以前的问题解决了 这导致了下一个问题。我需要收听多个多播组,并且: 确定是否收到每个特定组的任何数据,并报告哪些组有数据,哪些组没有数据 同时在所有通道上侦听用户可配置超时时间段的数据 我试图在一段单独的代码中实现这一点,其中多播组、端口和接口都是硬编码的,一旦我把它整理好并理解了,我将把它迁移到我的主

我目前正在使用Ruby 1.8.7开发Windows工具的Linux版本,该工具基于用户配置的多播组和端口在多达2个接口上检查多播数据

我有一个以前的问题,我不知道如何收听多个多播频道,但这已经从以前的问题解决了

这导致了下一个问题。我需要收听多个多播组,并且:

确定是否收到每个特定组的任何数据,并报告哪些组有数据,哪些组没有数据

同时在所有通道上侦听用户可配置超时时间段的数据

我试图在一段单独的代码中实现这一点,其中多播组、端口和接口都是硬编码的,一旦我把它整理好并理解了,我将把它迁移到我的主程序中,用户输入和验证已经完成。我已经更新了我的简单程序代码,所以现在看起来像:

#!/usr/bin/ruby

require 'socket'
require 'ipaddr'
require 'timeout'

MCAST_GROUP_A
{
  :addr1 => '233.54.12.111',
  :addr2 => '233.86.230.111',
  :port => 26477,
  :bindaddr => '172.31.230.156'
}

MCAST_GROUP_B = 
{
  :addr => '233.54.12.111',
  :port => 18170,
  :bindaddr => '172.31.230.156'
}

ipA1 = IPAddr.new(MCAST_GROUP_A[:addr1]).hton + IPAddr.new(MCAST_GROUP_A[:bindaddr]).hton
ipA2 = IPAddr.new(MCAST_GROUP_A[:addr2]).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
  sockB = UDPSocket.open

  sockA.bind Socket::INADDR_ANY, MCAST_GROUP_A[:port]
  sockB.bind Socket::INADDR_ANY, MCAST_GROUP_B[:port]

  sockA.setsockopt Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, ipA1
  sockA.setsockopt Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, ipA2
  sockB.setsockopt Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, ipB

  timeoutSeconds = 10
  Timeout.timeout(timeoutSeconds) do 
    msg1, info1 = sockA.recvfrom(1024)
    msg2, info2 = sockB.recvfrom(1024)
    #puts "MSG: #{msg} from #{info[2]} (#{info[3]})/#{info[1]} len #{msg.size}"
    puts "MSG: <garbled> from #{info1[2]} (#{info1[3]})/#{info1[1]} len #{msg1.size}"
    puts "MSG: <garbled> from #{info2[2]} (#{info2[3]})/#{info2[1]} len #{msg2.size}"
  end
  rescue Timeout::Error
    puts "Nothing received connection timedout\n"
ensure
  sockA.close
  sockB.close
end
但这产生了一个问题,因为它报告什么也没有收到,因为B套接字上的数据不存在

我理解这样做的原因是第二个recvfrom超时,因此我们最终进入代码的救援部分。但由于这是我的第一个Ruby程序,而且我还在学习它,所以我不确定该怎么解决它

简言之,我需要理解:

由于socket上有2个多播组,如何确定在该socket上接收了哪个通道数据

如何同时监控可配置数量的多播组以获取数据,并且不会因为一次接收数据失败而导致输出错误


要同时监视多个套接字,请使用select函数。给出了如何在Ruby中实现这一点的示例

至少在C语言中,可以使用IP_PKTINFO套接字选项和recvfrom函数获取传入数据包的目标地址,但是Ruby API看起来并没有公开该功能