Class: DNS::Server::Dispatcher::ConnectionDispatcher

Inherits:
Object
  • Object
show all
Defined in:
lib/faildns/server/dispatcher/socket.rb,
lib/faildns/server/dispatcher/connectiondispatcher.rb

Defined Under Namespace

Classes: Socket

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(dispatcher) ⇒ ConnectionDispatcher



35
36
37
38
39
40
41
42
43
# File 'lib/faildns/server/dispatcher/connectiondispatcher.rb', line 35

def initialize (dispatcher)
  @server     = dispatcher.server
  @dispatcher = dispatcher

  @host = @server.options[:host] || '0.0.0.0'
  @port = @server.options[:port] || 53

  @sockets = []
end

Instance Attribute Details

#dispatcherObject (readonly)

Returns the value of attribute dispatcher.



33
34
35
# File 'lib/faildns/server/dispatcher/connectiondispatcher.rb', line 33

def dispatcher
  @dispatcher
end

#listeningObject (readonly)

Returns the value of attribute listening.



33
34
35
# File 'lib/faildns/server/dispatcher/connectiondispatcher.rb', line 33

def listening
  @listening
end

#serverObject (readonly)

Returns the value of attribute server.



33
34
35
# File 'lib/faildns/server/dispatcher/connectiondispatcher.rb', line 33

def server
  @server
end

Instance Method Details

#handle(string, socket) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
# File 'lib/faildns/server/dispatcher/connectiondispatcher.rb', line 76

def handle (string, socket)
  DNS.debug "#{socket.inspect}: #{string.inspect}", { :level => 9 }

  Thread.new(string) {|input|
    begin
      @dispatcher.dispatch :input, Socket.new(@dispatcher, socket), Message.parse(string)
    rescue Exception => e
      DNS.debug e
    end
  }
end

#readObject



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/faildns/server/dispatcher/connectiondispatcher.rb', line 54

def read
  reading, = IO::select @sockets.concat([@listening[:UDP], @listening[:TCP]])

  if !reading
    return
  end

  reading.each {|socket|
    if socket.is_a? TCPServer
      @sockets.push @listening[:TCP].accept_nonblock
    elsif socket.is_a? TCPSocket
      self.handle socket.recv_nonblock(65535), socket
      @sockets.delete(socket)
    else
      begin
        self.handle *@listening[:UDP].recvfrom_nonblock(512)
      rescue Errno::EAGAIN
      end
    end
  }
end

#startObject



45
46
47
48
49
50
51
52
# File 'lib/faildns/server/dispatcher/connectiondispatcher.rb', line 45

def start
  @listening = {
    :TCP => TCPServer.new(@host, @port),
    :UDP => UDPSocket.new
  }

  @listening[:UDP].bind(@host, @port)
end