class BroadcastClient

Constants

MULTICAST_ADDR

Public Class Methods

new(handle,bind_address,bind_port) click to toggle source

BIND_ADDR = “0.0.0.0” PORT = 6811

# File lib/ignition/engine/broadcast_client.rb, line 11
def initialize(handle,bind_address,bind_port)
  @handle    = handle
  @client_id = SecureRandom.hex(5)
  @listeners = []

  @bind_addr = bind_address
  @port = bind_port

  @stopped = false
end

Public Instance Methods

add_message_listener(listener) click to toggle source
# File lib/ignition/engine/broadcast_client.rb, line 22
def add_message_listener(listener)
  listen unless listening?
  @listeners << listener
  # puts "add_message_listener 1"
end
stop!() click to toggle source
# File lib/ignition/engine/broadcast_client.rb, line 39
def stop!
  # puts "Stopping BroadcastClient"
  @stopped = true
end
transmit(content) click to toggle source
# File lib/ignition/engine/broadcast_client.rb, line 28
def transmit(content)
  message = BroadcastMessage.new(
    "client_id" => @client_id,
    "handle"    => @handle,
    "content"   => content
  )

  socket.send(message.to_json, 0, MULTICAST_ADDR, @port)
  message
end

Private Instance Methods

bind_address() click to toggle source
# File lib/ignition/engine/broadcast_client.rb, line 85
def bind_address
  IPAddr.new(MULTICAST_ADDR).hton + IPAddr.new(@bind_addr).hton
end
listen() click to toggle source
# File lib/ignition/engine/broadcast_client.rb, line 46
def listen
  puts "listen"
  socket.bind(@bind_addr, @port)

  Thread.new do
    begin
      while(!@stopped)
        # puts "waiting on socket"
        attributes, _ = socket.recvfrom(1024)
        message = BroadcastMessage.inflate(attributes)
        # puts "got data"
        # unless message.client_id == @client_id
          @listeners.each { |listener| listener.new_message(message) }
        # end
      end
    rescue Exception => exc
      puts exc.message
      puts exc.backtrace
    end
    # puts "closing socket"
    socket.close
  end

  @listening = true
end
listening?() click to toggle source
# File lib/ignition/engine/broadcast_client.rb, line 72
def listening?
  puts "listening?"
  @listening == true
end
socket() click to toggle source
# File lib/ignition/engine/broadcast_client.rb, line 77
def socket
  @socket ||= UDPSocket.open.tap do |socket|
    socket.setsockopt(Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, bind_address)
    socket.setsockopt(Socket::IPPROTO_IP, Socket::IP_MULTICAST_TTL, 1)
    socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, 1)
  end
end