'Кто онлайн?' Сетевая программа Ruby - PullRequest
0 голосов
/ 04 августа 2009

У меня есть несколько встроенных систем 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?

1 Ответ

0 голосов
/ 05 августа 2009

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

...