'谁在线上?' Ruby网络计划

时间:2009-08-04 08:16:44

标签: ruby networking sockets udp

我有几个嵌入式Linux系统,我想写一个'谁在线?' Ruby中的网络服务。以下是我的代码的相关部分:

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

我从PC发送'KNOCK KNOCK'命令。现在,问题是因为它们都同时收到消息,它们也会同时响应,这会导致Broken Pipe异常(这是我'救援重试'代码的原因)。这段代码有时可行,但是;其他时候救援重试代码的一部分(由sock.send的Broken Pipe异常唤醒)会导致一个或多个系统在5秒左右后响应。

是否有更好的方法可以做到这一点,因为我认为我无法摆脱Broken Pipe异常?

1 个答案:

答案 0 :(得分:0)

我发现异常是由send命令中的'r.ipaddress'部分引起的,这与我的嵌入式系统的内部结构有关...