class DCase::Server

Attributes

crypto[RW]

Public Class Methods

new(host, crypto, config) click to toggle source
# File lib/dcase/server.rb, line 8
def initialize(host, crypto, config)
  @config = config

  @server = UDPSocket.new
  @server.to_io.setsockopt(:SOCKET, :REUSEADDR, 1)
  @server.bind(host, @config.port)

  @crypto = crypto

  async.run
end

Public Instance Methods

finalize() click to toggle source
# File lib/dcase/server.rb, line 20
def finalize
  @server.close unless @server.closed?
end
handle_data(data, port, addr) click to toggle source
# File lib/dcase/server.rb, line 31
def handle_data(data, port, addr)
  request = UDPSocket.new
  request.send crypto.decrypt(data), 0, @config.dns_list.sample, 53

  async.start_connect(request, port, addr)
end
run() click to toggle source
# File lib/dcase/server.rb, line 24
def run
  loop do
    data, (_, port, addr) = @server.recvfrom(16384)
    handle_data(data, port, addr)
  end
end
start_connect(request, port, addr) click to toggle source
# File lib/dcase/server.rb, line 38
def start_connect(request, port, addr)
  data, (_, _port, _addr) = request.recvfrom(16384)
  @server.send crypto.encrypt(data), 0, addr, port
  request.close unless request.closed?
end