class SSDP::SsdpListener

Attributes

handler[RW]
port[R]

Public Class Methods

new(port = 1900) click to toggle source
# File lib/ssdp.rb, line 78
def initialize(port = 1900)
  @host = '0.0.0.0'
  @port = port
  @handler = nil
  @finishing = false
end

Public Instance Methods

finish() click to toggle source
# File lib/ssdp.rb, line 88
def finish
  @finishing = true
end
run() click to toggle source
# File lib/ssdp.rb, line 92
def run
  @finishing = false
  socket = UDPSocket.new
  membership = IPAddr.new(MCAST_HOST).hton + IPAddr.new(@host).hton
  socket.setsockopt(:IPPROTO_IP, :IP_ADD_MEMBERSHIP, membership)
  socket.setsockopt(:SOL_SOCKET, :SO_REUSEADDR, 1)
  socket.setsockopt(:SOL_SOCKET, :SO_REUSEPORT, 1)
  socket.bind(@host, @port)
  fds = [socket]
  $logger.debug 'listen...'
  while @finishing == false do
    timeout = 1
    if ios = select(fds, [], [], timeout)
      data, addr = socket.recvfrom(4096)
      ssdp_header = SsdpHeader.new HttpHeader.read(data.chomp)
      if @handler
        responses = @handler.on_ssdp_header(ssdp_header)
        if responses != nil
          responses.each do |response|
            socket.send response.to_s, 0, addr[2], addr[1]
          end
        end
      end
    end
  end
  socket.close
end
start() click to toggle source
# File lib/ssdp.rb, line 120
def start
  @run_thread = Thread.new { self.run }
end
stop() click to toggle source
# File lib/ssdp.rb, line 124
def stop
  @finishing = true
  @run_thread.join
end