module SSDP

Constants

DEFAULTS
HEADER_MATCH

Public Class Methods

create_broadcaster() click to toggle source
# File lib/ssdp.rb, line 59
def create_broadcaster
  broadcaster = UDPSocket.new
  broadcaster.setsockopt Socket::SOL_SOCKET, Socket::SO_BROADCAST, true
  broadcaster.setsockopt Socket::IPPROTO_IP, Socket::IP_MULTICAST_TTL, 1
  broadcaster
end
create_listener(options) click to toggle source
# File lib/ssdp.rb, line 45
def create_listener(options)
  listener = UDPSocket.new
  listener.do_not_reverse_lookup = true
  membership = IPAddr.new(options[:broadcast]).hton + IPAddr.new(options[:bind]).hton
  listener.setsockopt Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, membership
  listener.setsockopt Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true
  if defined? Socket::SO_REUSEPORT
    listener.setsockopt Socket::SOL_SOCKET, Socket::SO_REUSEPORT, true
  end
  listener.bind options[:bind], options[:port]
  listener
end
parse_ssdp(message) click to toggle source
# File lib/ssdp.rb, line 26
def parse_ssdp(message)
  message.gsub! "\r\n", "\n"
  header, body = message.split "\n\n"

  header = header.split "\n"
  status = header.shift
  params = {}
  header.each do |line|
    match = HEADER_MATCH.match line
    next if match.nil?
    value = match[2]
    value = (value[1, value.length - 2] || '') if value.start_with?('"') && value.end_with?('"')
    params[match[1]] = value
  end

  { :status => status, :params => params, :body => body }
end

Private Instance Methods

create_broadcaster() click to toggle source
# File lib/ssdp.rb, line 59
def create_broadcaster
  broadcaster = UDPSocket.new
  broadcaster.setsockopt Socket::SOL_SOCKET, Socket::SO_BROADCAST, true
  broadcaster.setsockopt Socket::IPPROTO_IP, Socket::IP_MULTICAST_TTL, 1
  broadcaster
end
create_listener(options) click to toggle source
# File lib/ssdp.rb, line 45
def create_listener(options)
  listener = UDPSocket.new
  listener.do_not_reverse_lookup = true
  membership = IPAddr.new(options[:broadcast]).hton + IPAddr.new(options[:bind]).hton
  listener.setsockopt Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, membership
  listener.setsockopt Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true
  if defined? Socket::SO_REUSEPORT
    listener.setsockopt Socket::SOL_SOCKET, Socket::SO_REUSEPORT, true
  end
  listener.bind options[:bind], options[:port]
  listener
end
parse_ssdp(message) click to toggle source
# File lib/ssdp.rb, line 26
def parse_ssdp(message)
  message.gsub! "\r\n", "\n"
  header, body = message.split "\n\n"

  header = header.split "\n"
  status = header.shift
  params = {}
  header.each do |line|
    match = HEADER_MATCH.match line
    next if match.nil?
    value = match[2]
    value = (value[1, value.length - 2] || '') if value.start_with?('"') && value.end_with?('"')
    params[match[1]] = value
  end

  { :status => status, :params => params, :body => body }
end