0

我有一个基本的 ruby​​ 程序,它在端口(53)上侦听,接收数据然后发送到另一个位置(Google DNS 服务器 - 8.8.8.8)。回复不会回到原来的目的地,或者我没有正确转发它们。

这是代码。注意我正在使用 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

任何关于调试原因或提示的想法,将不胜感激。

4

1 回答 1

5

明显的问题是:

  1. UDP 通信通常是无连接的,使用 4 参数版本的send代替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
于 2010-12-02T13:17:59.177 回答