Переадресация запросов UDPSocket - PullRequest
0 голосов
/ 01 декабря 2010

У меня есть базовая программа ruby, которая прослушивает порт (53), получает данные и затем отправляет их в другое место (DNS-сервер Google - 8.8.8.8). Ответы не возвращаются в исходное место назначения, или я не пересылаю их правильно.

Вот код. NB Я использую EventMachine

require 'rubygems'
require 'eventmachine'

module DNSServer
    def post_init
        puts 'connected'
    end

    def receive_data(data)
        # Forward all data
        conn = UDPSocket.new
        conn.connect '8.8.8.8', 53
        conn.send data, 0
        conn.close

        p data.unpack("H*")
    end

    def unbind
        puts 'disconnected'
    end
end
EM.run do
    EM.open_datagram_socket '0.0.0.0', 53, DNSServer
end

Любые мысли о том, почему или советы по отладке, будут наиболее цениться.

1 Ответ

5 голосов
/ 02 декабря 2010

Очевидные проблемы:

  1. Обычно UDP-соединения без установления соединения, используйте версию аргумента send с 4 аргументами вместо connect
  2. Вы не получаете никаких данныхиз сокета, говорящего на 8.8.8.8
  3. Вы не отправляете никаких данных обратно (#send_data) исходному клиенту

Это работает:

require 'socket'
require 'rubygems'
require 'eventmachine'

module DNSServer
    def receive_data(data)
        # Forward all data
        conn = UDPSocket.new
        conn.send data, 0, '8.8.8.8', 53
        send_data conn.recv 4096
    end
end

EM.run do
    EM.open_datagram_socket '0.0.0.0', 53, DNSServer
end
...