Ruby UDPSocket抛出ERRNO:ECONNRESET

时间:2014-05-02 18:58:07

标签: ruby sockets udp

我将开发一个像“桥”一样的软件:它将在一个端口上接收数据,以某种方式转换该数据,然后将数据从另一个端口发送回同一主机。 我打算使用下面的代码示例来测试网桥,但我目前还没有实际运行的网桥。

我的问题是为什么第一次拨打recv trows Errno::ECONNRESET? 目前没有远程UDP套接字将数据发送到端口6000,但由于这是UDP,我们不需要建立连接。 我只是希望recv能够阻止。

require 'socket'

s = UDPSocket.new
s.bind('localhost', 6000)
s.connect('localhost', 7000)

begin
  s.send('Bender, honey, we love you.', 0)
  puts s.recv(1024)
rescue Errno::ECONNRESET
  puts 'Shut up baby, I know it!'
end

puts 'The next recv will block like expected.'
s.recv(1024)
puts 'If you are reading this then there might be a problem...'

1 个答案:

答案 0 :(得分:0)

如果套接字recv上有错误,则不会阻止,但删除并返回错误。在这种情况下,数据包可能已发送,但在localhost:7000没有设置接收器,因此它返回ICMP无法访问。因此,将套接字错误设置为ECONNRESET