views:

81

answers:

1

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?

A: 

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

kramer