module SSDP

Constants

MCAST_HOST
MCAST_PORT

Public Class Methods

send_msearch(st, mx, handler = nil) click to toggle source
# File lib/ssdp.rb, line 131
def self.send_msearch(st, mx, handler = nil)
  socket = UDPSocket.new
  socket.setsockopt(:IPPROTO_IP, :IP_MULTICAST_TTL, 1)
  payload = "M-SEARCH * HTTP/1.1\r\n" \
            "HOST: #{MCAST_HOST}:#{MCAST_PORT}\r\n" \
            "MAN: \"ssdp:discover\"\r\n" \
            "MX: 3\r\n" \
            "ST: ssdp:all\r\n" \
            "\r\n"

  socket.send(payload, 0, MCAST_HOST, MCAST_PORT)

  start = Process.clock_gettime(Process::CLOCK_MONOTONIC, :second)

  fds = [socket]

  lst = []

  while true
    cur = Process.clock_gettime(Process::CLOCK_MONOTONIC, :second)
    if (cur - start) >= mx 
      break
    end
    if ios = select(fds, [], [], 1)
      data, addr = socket.recvfrom(4096)
      ssdp_header = SsdpHeader.new HttpHeader.read(data.chomp)
      if handler
        handler.call(ssdp_header)
      end
      lst << ssdp_header
    end
  end
  socket.close
  return lst
end