2010-11-30 109 views
0

我有一個基本的ruby程序,它偵聽端口(53),接收數據,然後發送到另一個位置(Google DNS服務器 - 8.8.8.8)。回覆不會回到原來的目的地,或者我沒有正確轉發它們。轉發請求UDPSocket

這是代碼。 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 

任何想法爲什麼或調試技巧,將不勝感激。

回答

5

最明顯的問題是:

  1. UDP通訊科通常是無連接的,使用的send代替connect
  2. 你沒有收到來自任何插座數據說話8.8.8.8
  3. 的4參數版本
  4. 你不發送任何數據備份(#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