【发布时间】:2009-08-04 08:16:44
【问题描述】:
我有几个嵌入式 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 异常,有没有更好的方法来做到这一点?
【问题讨论】:
标签: ruby networking sockets udp