Я пытаюсь установить параметры сокета (в частности, SO_REUSEADDR) для соединения UDP с EventMachine .Как есть, фрагмент кода работает.Когда второй open_datagram_socket
не закомментирован, произойдет сбой с этой ошибкой:
eventmachine.rb: 844: в `open_udp_socket ': нет сокета датаграммы (RuntimeError)
Из просмотра источникаПохоже, что он просто возвращает ноль в случае неудачи, что неудивительно.Кажется, что опция сокета просто не установлена правильно, но я не знаком с библиотекой, ruby или программированием сокетов, чтобы знать, что я делаю что-то не так.Я не могу себе представить, что библиотека просто не поддерживает что-то подобное, но, возможно, это возможно.
Как мне заставить SO_REUSEADDR работать с сокетом дейтаграммы?
require 'eventmachine'
class PassThruServer < EM::Connection
def initialize
set_sock_opt Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true
end
def post_init()
# too late?
# set_sock_opt Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true
end
def receive_data(data)
puts "PT: "+ data.to_s()
send_datagram data, "localhost", 6060
end
end
class MessagePrinter < EM::Connection
def receive_data(data)
puts "MP: "+ data.to_s()
end
end
EM.run do
# pass through
EM.open_datagram_socket "localhost", 5050, PassThruServer
# EM.open_datagram_socket "localhost", 5050, PassThruServer
# test consumer
EM.open_datagram_socket "localhost", 6060, MessagePrinter
# test producer
EM.open_datagram_socket "localhost", nil do |conn|
i = 1
EM.add_periodic_timer(3) do
data = "message: "+ i.to_s() +"\n"
conn.send_datagram data, "localhost", 5050
i += 1
end
end
end
Этопохоже, что TCP может всегда использовать SO_REUSEADDR.Я не вижу, где UDP даже инициализирует параметры сокета.Насколько я понимаю, они должны были быть установлены до того, как сокет был фактически открыт?
Я действительно не получаю привязки ruby's C, чтобы убедиться, что я смотрю в правильном месте.