2009-08-04 9 views
0

J'ai plusieurs systèmes Linux intégrés que je veux écrire 'Qui est en ligne?' service réseau dans Ruby. Ci-dessous est une partie liée de mon code:'Qui est en ligne?' Ruby Network Program

mySocket = UDPSocket.new 
mySocket.bind("<broadcast>", 50050) 
loop do 
    begin 
     text, sender = mySocket.recvfrom(1024) 
     puts text 
     if text =~ /KNOCK KNOCK/ then 
      begin 
       sock = UDPSocket.open 
       sock.send(r.ipaddress, 0, sender[3], 50051) 
       sock.close 
      rescue 
       retry 
      end    
     end 
    rescue Exception => inLoopEx 
     puts inLoopEx.message 
     puts inLoopEx.backtrace.inspect 
     retry 
    end 
end 

J'envoie la commande 'KNOCK KNOCK' d'un PC. Maintenant, le problème est qu'ils reçoivent tous le message en même temps, ils essaient de répondre en même temps, ce qui provoque une exception Broken Pipe (qui est la raison de mon code 'rescue retry'). Ce code fonctionne bien parfois mais; D'autres fois, le service de réessayer une partie du code (qui est réveillé par l'exception Broken Pipe de sock.send) provoque un ou plusieurs systèmes à répondre après 5 secondes environ.

Y a-t-il une meilleure façon de faire cela puisque je suppose que je ne peux pas échapper à l'exception Broken Pipe?

Répondre

0

J'ai trouvé que l'exception était provoquée par la partie 'r.ipaddress' dans la commande send, qui est liée aux composants internes de mon système embarqué ...