Module: RubyDNS::TCPHandler
- Includes:
- Peername
- Defined in:
- lib/rubydns/handler.rb
Instance Method Summary collapse
- #initialize(server) ⇒ Object
-
#receive_data(data) ⇒ Object
Receive the data via a TCP connection, process messages when we receive the indicated amount of data.
-
#unbind ⇒ Object
Check that all data received was processed.
Methods included from Peername
Instance Method Details
#initialize(server) ⇒ Object
102 103 104 105 106 107 108 109 |
# File 'lib/rubydns/handler.rb', line 102 def initialize(server) @server = server @buffer = BinaryStringIO.new @length = nil @processed = 0 end |
#receive_data(data) ⇒ Object
Receive the data via a TCP connection, process messages when we receive the indicated amount of data.
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
# File 'lib/rubydns/handler.rb', line 112 def receive_data(data) # We buffer data until we've received the entire packet: @buffer.write(data) # Message includes a 16-bit length field.. we need to see if we have received it yet: if @length == nil # Not enough data received yet... if (@buffer.size - @processed) < 2 return end # Grab the length field: @length = @buffer.string.byteslice(@processed, 2).unpack('n')[0] @processed += 2 end if (@buffer.size - @processed) >= @length data = @buffer.string.byteslice(@processed, @length) = {:connection => self} UDPHandler.process(@server, data, ) do |answer| data = answer.encode @server.logger.debug "Writing response to client (#{data.bytesize} bytes) via TCP..." self.send_data([data.bytesize].pack('n')) self.send_data(data) end @processed += @length @length = nil end end |
#unbind ⇒ Object
Check that all data received was processed.
148 149 150 151 152 |
# File 'lib/rubydns/handler.rb', line 148 def unbind if @processed != @buffer.size @server.logger.debug "Unprocessed data remaining (#{@buffer.size - @processed} bytes unprocessed) on incoming TCP connection." end end |