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