2009-08-04 2 views
0

У меня есть несколько встроенных систем Linux, которые я хочу написать «Кто в сети»? сетевое обслуживание в Ruby. Ниже родственная часть моего кода:'Кто в сети?' 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 

Я посылаю команду «Knock Knock» с ПК. Теперь проблема заключается в том, что все они получают сообщение одновременно, они также пытаются ответить одновременно, что вызывает исключение Broken Pipe (что является причиной моего кода «повторного повторного запуска»). Иногда этот код работает нормально, но; в других случаях часть повторной попытки восстановления кода (которая разбужена Исключением Broken Pipe из sock.send) заставляет одну или несколько систем реагировать через 5 секунд или около того.

Есть ли лучший способ сделать это, так как я предполагаю, что я не могу избежать исключения Broken Pipe?

ответ

0

Я обнаружил, что исключение было вызвано частью «r.ipaddress» в команде send, которая связана с внутренними встроенными системами ...