Pergunta

I have a basic ruby program, that listens on a port (53), receives the data and then sends to another location (Google DNS server - 8.8.8.8). The responses are not going back to their original destination, or I'm not forwarding them correctly.

Here is the code. NB I'm using 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

Any thoughts as to why or tips to debug, would be most appreciated.

Foi útil?

Solução

The obvious problems are:

  1. UDP comms are usually connectionless, use the 4 argument version of send instead of connect
  2. You're not receiving any data from the socket talking to 8.8.8.8
  3. You're not sending any data back (#send_data) to the original client

This seems to work:

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top