Question

I have several embedded linux systems that I want to write a 'Who's Online?' network service in Ruby. Below is related part of my code:

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

I send the 'KNOCK KNOCK' command from a PC. Now, the problem is since they all receive the message at the same time, they try to respond at the same time too, which causes a Broken Pipe exception (which is the reason of my 'rescue retry' code). This code works OK sometimes but; other times the rescue retry part of the code (which is waked by Broken Pipe exception from sock.send) causes one or more systems to respond after 5 seconds or so.

Is there a better way of doing this since I assume I cant escape the Broken Pipe exception?

Was it helpful?

Solution

I have found that exception was caused by the 'r.ipaddress' part in the send command, which is related to my embedded system's internals...

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top