2010-11-30 21 views
0

J'ai un programme de base de ruby, qui écoute sur un port (53), reçoit les données et envoie ensuite à un autre endroit (Google DNS server - 8.8.8.8). Les réponses ne retournent pas à leur destination d'origine ou je ne les redirige pas correctement.Demandes de transfert UDPSocket

Voici le code. NB J'utilise 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 

Toute pensée pour expliquer pourquoi ou des conseils pour le débogage, serait très appréciée.

Répondre

5

Les problèmes évidents sont:

  1. comms UDP sont généralement sans connexion, utilisez la version 4 argument de send au lieu de connect
  2. Vous ne recevez pas de données de la prise parler à 8.8.8.8
  3. Vous n'êtes pas envoyer des données de retour (#send_data) au client d'origine

Cela semble fonctionner:

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