转发请求UDPSocket

时间:2010-11-30 22:09:35

标签: ruby network-programming dns udp eventmachine

我有一个基本的ruby程序,它侦听端口(53),接收数据然后发送到另一个位置(Google DNS服务器 - 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 个答案:

答案 0 :(得分:5)

明显的问题是:

  1. UDP通信通常是无连接的,使用send的4参数版本而不是connect
  2. 您没有收到来自与8.8.8.8
  3. 交谈的套接字的任何数据
  4. 您没有向原始客户端发送任何数据(#send_data
  5. 这似乎有效:

    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