У меня есть доступная версия Ruby 1.8.7, и ее нельзя обновить, поскольку она является частью стандартного образа, который в настоящее время используется на всех серверах Linux компаний, и все, что я делаю, должно работать на всех этих серверах. без проблем (я надеюсь, что это не будет проблемой)
Проект, который я делаю, заключается в воссоздании приложения, которое в настоящее время работает в Windows на сервере 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 ~]# ./UDPServer.rb ./UDPServer.rb:35:in `setsockopt': Адрес уже используется (Errno::EADDRINUSE) из ./UDPServer.rb:35
Вот где я нахожусь и действительно мог бы сделать сначала указатели на то, что не так (надеюсь, с обновлением кода), а затем, как только я заработаю этот пример, следующим шагом будет добавление второго интерфейса в микс для прослушивания снова несколько многоадресных групп,