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