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?

¿Fue útil?

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 ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top