class Discovery::Announcer

Public Class Methods

new() { |client_ip, data| ... } click to toggle source
# File lib/simple_discovery/announcer.rb, line 23
def initialize
  @services = {}
  @thread = Thread.fork do
    begin
      s = UDPSocket.new
      s.bind('0.0.0.0', PORT)

      loop do
        body, sender = s.recvfrom(1024)
        data = Marshal.load(body)
        client_ip = sender[3]

        services = @services.map { |name, service| service[:name] = name; service }

        yield(client_ip, data)

        response = { msg: "Discovery/Announcer", host: Socket.gethostname, services: services }
        reply(client_ip, data[:port], response) unless data[:port].nil?
      end
    rescue Interrupt
    ensure
      s.close
    end
  end
end

Public Instance Methods

add_service(name:, description: "", address:, port: ) click to toggle source
# File lib/simple_discovery/announcer.rb, line 8
def add_service(name:, description: "", address:, port: )
  @services[name] = { description: "", address: address, port: port}
end
join() click to toggle source
# File lib/simple_discovery/announcer.rb, line 49
def join
  @thread.join
end
remove_service(name:) click to toggle source
# File lib/simple_discovery/announcer.rb, line 12
def remove_service(name:)
  @services.delete name

end
reply(ip, port, response) click to toggle source
# File lib/simple_discovery/announcer.rb, line 17
def reply(ip, port, response)
  s = UDPSocket.new
  s.send(Marshal.dump(response), 0, ip, port)
  s.close
end