转发请求UDPSocket

tga*_*ews 0 ruby dns udp network-programming eventmachine

我有一个基本的ruby程序,它侦听端口(53),接收数据然后发送到另一个位置(谷歌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
Run Code Online (Sandbox Code Playgroud)

任何关于调试原因或提示的想法都将非常受欢迎.

Aln*_*tak 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
Run Code Online (Sandbox Code Playgroud)