'¿Quién está en línea?' Programa de red Ruby
-
22-07-2019 - |
Pregunta
Tengo varios sistemas Linux integrados que quiero escribir '¿Quién está en línea?' servicio de red en Ruby. A continuación se muestra una parte relacionada de mi código:
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
Envío el comando 'KNOCK KNOCK' desde una PC. Ahora, el problema es que, dado que todos reciben el mensaje al mismo tiempo, también intentan responder al mismo tiempo, lo que provoca una excepción de Broken Pipe (que es la razón de mi código de 'reintento de rescate'). Este código funciona bien a veces pero; otras veces, la parte de reintento de rescate del código (que se activa por la excepción Broken Pipe de sock.send) hace que uno o más sistemas respondan después de 5 segundos más o menos.
¿Hay una mejor manera de hacerlo ya que supongo que no puedo escapar de la excepción Broken Pipe?
Solución
He descubierto que la excepción fue causada por la parte 'r.ipaddress' en el comando de envío, que está relacionado con las partes internas de mi sistema incrustado ...