class LIFX::LAN::Transport::TCP

@api private @private

Constants

CONNECT_TIMEOUT
HEADER_SIZE
SEND_TIMEOUT

Public Class Methods

new(*args) click to toggle source
Calls superclass method LIFX::LAN::Transport::new
# File lib/lifx/lan/transport/tcp.rb, line 11
def initialize(*args)
  super
  connect
end

Public Instance Methods

close() click to toggle source
Calls superclass method LIFX::LAN::Transport#close
# File lib/lifx/lan/transport/tcp.rb, line 34
def close
  super
  return if !@socket
  if !@socket.closed?
    @socket.close
    notify_observers(:disconnected)
  end
  @socket = nil
  if @listener
    @listener.abort
  end
  @listener = nil
end
connect() click to toggle source
# File lib/lifx/lan/transport/tcp.rb, line 21
def connect
  Timeout.timeout(CONNECT_TIMEOUT) do
    @socket = TCPSocket.new(host, port) # Performs the connection
  end
  @socket.setsockopt(Socket::SOL_SOCKET,  Socket::SO_SNDBUF,    1024)
  @socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY,  1)
  logger.info("#{self}: Connected.")
rescue => ex
  logger.warn("#{self}: Exception occurred in #connect - #{ex}")
  logger.debug("#{self}: Backtrace: #{ex.backtrace.join("\n")}")
  @socket = nil
end
connected?() click to toggle source
# File lib/lifx/lan/transport/tcp.rb, line 16
def connected?
  !!(@socket && !@socket.closed?)
end
listen() click to toggle source
# File lib/lifx/lan/transport/tcp.rb, line 49
def listen
  return if @listener
  @listener = Thread.start do
    while @socket do
      begin
        header_data = @socket.recv(HEADER_SIZE, Socket::MSG_PEEK)
        header      = Protocol::Header.read(header_data)
        size        = header.msg_size
        data        = @socket.recv(size)
        message     = Message.unpack(data)

        notify_observers(:message_received, {message: message, ip: host, transport: self})
      rescue Message::UnpackError
        if Config.log_invalid_messages
          logger.info("#{self}: Exception occurred while decoding message - #{ex}")
          logger.info("Data: #{data.inspect}")
        end
      rescue => ex
        logger.warn("#{self}: Exception occurred in #listen - #{ex}")
        logger.debug("#{self}: Backtrace: #{ex.backtrace.join("\n")}")
        close
      end
    end
  end
end
write(message) click to toggle source
# File lib/lifx/lan/transport/tcp.rb, line 76
def write(message)
  data = message.pack
  Timeout.timeout(SEND_TIMEOUT) do
    @socket.write(data)
  end
  true
rescue => ex
  logger.warn("#{self}: Exception in #write: #{ex}")
  logger.debug("#{self}: Backtrace: #{ex.backtrace.join("\n")}")
  close
  false
end